Aggregation Queries
Aggregationsabfragen berechnen Zusammenfassungswerte (Durchschnitte, Summen, Extremwerte) über Zeitreihen-Datenpunkte hinweg, anstatt einzelne Zeilen zurückzugeben. Verwenden Sie diese, wenn Sie berechnete Kennzahlen statt Rohdaten benötigen – zum Beispiel die durchschnittliche Spannung über die letzte Stunde oder die insgesamt pro Maschine erzeugte Energie.
OctoMesh unterstützt zwei Typen von Aggregationsabfragen:
- Aggregation Query – berechnet aggregierte Werte über alle übereinstimmenden Datenpunkte
- Grouped Aggregation Query – berechnet aggregierte Werte, gruppiert nach einer oder mehreren Spalten (ähnlich wie SQL
GROUP BY)
Aggregationstypen
| Typ | Beschreibung | Beispiel |
|---|---|---|
AVG | Durchschnittswert | Durchschnittliche Spannung über einen Zeitraum |
MIN | Minimalwert | Niedrigster Temperaturmesswert |
MAX | Maximalwert | Spitzenwert des Stromverbrauchs |
COUNT | Anzahl der Datenpunkte | Anzahl der aufgezeichneten Messungen |
SUM | Summe der Werte | Insgesamt erzeugte Energie |
Aggregation Query
Die Aggregationsabfrage berechnet ein einzelnes aggregiertes Ergebnis über alle übereinstimmenden Datenpunkte. Verwenden Sie das Feld transientStreamDataAggregationQuery.
Grundlegende Verwendung
query {
streamData {
transientStreamDataAggregationQuery(
ckId: "Industry.Energy/EnergyMeter"
columnPaths: [
{ attributePath: "voltage", aggregationType: AVG },
{ attributePath: "voltage", aggregationType: MIN },
{ attributePath: "voltage", aggregationType: MAX }
]
) {
totalCount
items {
cells {
items {
attributePath
value
}
}
}
}
}
}
Antwort:
{
"data": {
"streamData": {
"transientStreamDataAggregationQuery": {
"totalCount": 1,
"items": [
{
"cells": {
"items": [
{ "attributePath": "Avg_voltage", "value": 230.4 },
{ "attributePath": "Min_voltage", "value": 218.7 },
{ "attributePath": "Max_voltage", "value": 242.1 }
]
}
}
]
}
}
}
}
Das Ergebnis enthält eine einzelne Zeile mit einer Zelle pro Aggregationsspalte. Der attributePath in der Antwort ist mit dem Aggregationstyp präfixiert (z. B. Avg_voltage, Min_voltage).
Parameter
| Parameter | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
| ckId | String! | Ja | Der abzufragende CK-Typ |
| columnPaths | [StreamDataQueryColumnInput!]! | Ja | Spalten mit Aggregationstyp |
| arg | StreamDataArguments | Nein | Overrides für Zeitraum und Limit |
| fieldFilter | [FieldFilter] | Nein | Feldbezogene Vergleichsfilter |
| rtIds | [OctoObjectId] | Nein | Auf bestimmte Runtime-Entitäts-IDs eingrenzen |
| first | Int | Nein | Maximale Anzahl der zurückzugebenden Elemente |
| after | String | Nein | Paginierungs-Cursor |
StreamDataQueryColumnInput
Jede Spalte gibt das zu aggregierende Attribut und die anzuwendende Aggregationsfunktion an:
| Feld | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
| attributePath | String! | Ja | Das zu aggregierende Data-Stream-Attribut |
| aggregationType | AggregationType! | Ja | AVG, MIN, MAX, COUNT oder SUM |
Mit Zeitraum und Entitätsfilter
query {
streamData {
transientStreamDataAggregationQuery(
ckId: "Industry.Energy/EnergyMeter"
columnPaths: [
{ attributePath: "voltage", aggregationType: AVG },
{ attributePath: "power", aggregationType: SUM }
]
arg: {
queryMode: DEFAULT
from: "2024-03-21T00:00:00Z"
to: "2024-03-22T00:00:00Z"
}
rtIds: ["65dc6d24cc529cdc46c84fcc"]
) {
items {
cells {
items {
attributePath
value
}
}
}
}
}
}
Datenpunkte zählen
Verwenden Sie COUNT, um zu ermitteln, wie viele Datenpunkte für ein bestimmtes Attribut existieren:
query {
streamData {
transientStreamDataAggregationQuery(
ckId: "Industry.Energy/EnergyMeter"
columnPaths: [
{ attributePath: "voltage", aggregationType: COUNT }
]
arg: {
queryMode: DEFAULT
from: "2024-03-21T00:00:00Z"
to: "2024-03-22T00:00:00Z"
}
) {
items {
cells {
items {
attributePath
value
}
}
}
}
}
}
Grouped Aggregation Query
Eine gruppierte Aggregationsabfrage berechnet aggregierte Werte, gruppiert nach einer oder mehreren Spalten – entspricht einer SQL-GROUP BY-Klausel. Verwenden Sie das Feld transientStreamDataGroupedAggregationQuery.
Grundlegende Verwendung
Dieses Beispiel berechnet die durchschnittliche Spannung pro Entität:
query {
streamData {
transientStreamDataGroupedAggregationQuery(
ckId: "Industry.Energy/EnergyMeter"
groupByColumnPaths: ["rtId"]
columnPaths: [
{ attributePath: "voltage", aggregationType: AVG },
{ attributePath: "power", aggregationType: MAX }
]
) {
totalCount
items {
cells {
items {
attributePath
value
}
}
}
}
}
}
Antwort:
{
"data": {
"streamData": {
"transientStreamDataGroupedAggregationQuery": {
"totalCount": 3,
"items": [
{
"cells": {
"items": [
{ "attributePath": "rtId", "value": "65dc6d24cc529cdc46c84fcc" },
{ "attributePath": "Avg_voltage", "value": 230.4 },
{ "attributePath": "Max_power", "value": 1580.0 }
]
}
},
{
"cells": {
"items": [
{ "attributePath": "rtId", "value": "65dc6d24cc529cdc46c84fcd" },
{ "attributePath": "Avg_voltage", "value": 228.9 },
{ "attributePath": "Max_power", "value": 1620.5 }
]
}
},
{
"cells": {
"items": [
{ "attributePath": "rtId", "value": "65dc6d24cc529cdc46c84fce" },
{ "attributePath": "Avg_voltage", "value": 231.2 },
{ "attributePath": "Max_power", "value": 1490.3 }
]
}
}
]
}
}
}
}
Jede Zeile im Ergebnis stellt eine Gruppe dar. Die Werte der Gruppierungsspalte erscheinen in den Zellen neben den aggregierten Werten.
Parameter
| Parameter | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
| ckId | String! | Ja | Der abzufragende CK-Typ |
| groupByColumnPaths | [String!]! | Ja | Attributpfade, nach denen gruppiert wird |
| columnPaths | [StreamDataQueryColumnInput!]! | Ja | Spalten mit Aggregationstyp |
| arg | StreamDataArguments | Nein | Overrides für Zeitraum und Limit |
| fieldFilter | [FieldFilter] | Nein | Feldbezogene Vergleichsfilter |
| rtIds | [OctoObjectId] | Nein | Auf bestimmte Runtime-Entitäts-IDs eingrenzen |
| first | Int | Nein | Maximale Anzahl der zurückzugebenden Elemente |
| after | String | Nein | Paginierungs-Cursor |
Gruppierung nach mehreren Spalten
Sie können nach mehr als einer Spalte gruppieren. Dieses Beispiel gruppiert sowohl nach Entität als auch nach CK-Typ:
query {
streamData {
transientStreamDataGroupedAggregationQuery(
ckId: "Industry.Energy/EnergyMeter"
groupByColumnPaths: ["rtId", "ckTypeId"]
columnPaths: [
{ attributePath: "voltage", aggregationType: AVG }
]
arg: {
queryMode: DEFAULT
from: "2024-03-21T00:00:00Z"
to: "2024-03-22T00:00:00Z"
}
) {
totalCount
items {
cells {
items {
attributePath
value
}
}
}
}
}
}
Mit Filtern
Filter werden vor der Aggregation angewendet und schränken ein, welche Datenpunkte in die Berechnung einbezogen werden:
query {
streamData {
transientStreamDataGroupedAggregationQuery(
ckId: "Industry.Energy/EnergyMeter"
groupByColumnPaths: ["rtId"]
columnPaths: [
{ attributePath: "voltage", aggregationType: AVG }
]
fieldFilter: [
{ attributePath: "voltage", operator: GREATER_THAN, comparisonValue: 0 }
]
) {
totalCount
items {
cells {
items {
attributePath
value
}
}
}
}
}
}
Dies berechnet die durchschnittliche Spannung pro Entität, berücksichtigt dabei aber nur Datenpunkte, bei denen die Spannung größer als null ist.
Anwendungsfälle
| Szenario | Abfragetyp | Beispiel |
|---|---|---|
| Gesamtdurchschnitt für ein KPI-Widget | Aggregation | Durchschnittstemperatur über alle Sensoren |
| Produktionssummen pro Maschine | Grouped Aggregation | Gesamtausstoß gruppiert nach rtId |
| Datenqualitätsprüfung | Aggregation mit COUNT | Anzahl der Messwerte in einem Zeitraum |
| Vergleichs-Dashboard | Grouped Aggregation | Min/Max/Durchschnitt pro Entität für die Nebeneinander-Darstellung |