Zeitreihenfunktionen
Erledigt Bucketing · Aggregation · Interpolation · Regression mit einer einzigen CQL-Zeile. Keine separate Installation, keine UDF-Registrierung — es sind native, in die Datenbank integrierte Funktionen.
-- 시간별 평균, 빈 버킷은 직전 값으로 채운다
SELECT time_bucket_gapfill(1h, timestamp, '2026-07-01', '2026-07-02'),
locf(avg(value))
FROM pp.tm_tag_point
WHERE tag_id = 'TAG-001'
AND timestamp >= '2026-07-01' AND timestamp < '2026-07-02'
GROUP BY tag_id, time_bucket_gapfill(1h, timestamp, '2026-07-01', '2026-07-02')
ORDER BY timestamp ASC;
🔴 Beachten Sie die Reihenfolge der Argumente. Zeitreihenaggregationen folgen meist der Reihenfolge (값, 시각) — anders als Standardaggregationen wie avg(value), die nur einen Wert entgegennehmen.
Funktionsliste
Bucketing und Gap-Fill
| Funktion | Signatur | Rückgabewert | Beschreibung |
|---|---|---|---|
time_bucket | time_bucket(간격, ts [, 기준시각]) | timestamp | Startzeit des Buckets. Skalar für das Downsampling |
time_bucket_gapfill | time_bucket_gapfill(폭, ts, 시작, 끝) | timestamp | Für GROUP BY. Erzeugt auch leere Buckets |
locf | locf(집계) | Gleicher Typ wie die Argumente | Füllt leere Buckets mit dem letzten bekannten Wert (Last Observation Carried Forward) |
interpolate | interpolate(집계) | double | Füllt leere Buckets durch lineare Interpolation zwischen Vorder- und Rückwärtswert |
Wertextraktion und Änderungsraten
| Funktion | Signatur | Beschreibung |
|---|---|---|
first / last | first(값, ts) / last(값, ts) | Zeitlich frühester / spätester Wert |
delta | delta(값, ts) | Letzter − Erster |
rate | rate(값, ts) | delta ÷ verstrichene Sekunden (bezogen auf die beiden Endpunkte) |
derivative | derivative(값, ts) | Steigung der Kleinstquadrat-Regression, pro Sekunde |
counter_delta / counter_rate | (값, ts) | Kumulierter Zähleranstieg / Anstiegsrate pro Sekunde. Berücksichtigt einen Reset |
counter_* für kumulative ZählerWenn das Gerät neu startet, springt der kumulative Zähler auf 0 zurück. delta interpretiert das als «negative Änderung» und verfälscht den Wert, aber counter_delta · counter_rate erkennen den Reset und korrigieren ihn.
Statistik und Verteilungen
| Funktion | Signatur | Beschreibung |
|---|---|---|
percentile | percentile(값, q) — q ist [0,1] | Exakte kontinuierliche Perzentile (lineare Interpolation) |
time_weighted_average | (값, ts) | Zeitgewichteter Mittelwert |
integral | (값, ts) | Fläche unter der Kurve (Wert·Sekunden) |
variance / stddev | (값) | Stichprobenvarianz / Standardabweichung |
histogram | (값, 최소, 최대, 버킷수) | Histogramm mit gleichen Breiten. Länge 버킷수+2 |
approx_count_distinct | (값) | Approximation der Anzahl eindeutiger Werte |
time_weighted_average und avg sind unterschiedlichWenn der Sensor nicht in konstanten Intervallen liefert, wird der einfache Mittelwert von den «häufig auftretenden Intervallen» verzerrt. Nur eine Gewichtung nach der Zeit, über die der Wert gültig war, ergibt einen physikalisch korrekten Mittelwert.
Beziehungen zwischen zwei Variablen
| Funktion | Beschreibung |
|---|---|
corr(y, x) | Korrelationskoeffizient |
covar_pop(y, x) / covar_samp(y, x) | Kovarianz der Grundgesamtheit / Stichprobenkovarianz |
regr_slope(y, x) / regr_intercept(y, x) / regr_r2(y, x) | Steigung · Achsenabschnitt · Bestimmtheitsmaß der Regression von y gegen x |
Beispiele
Downsampling mit 5-Minuten-Buckets
SELECT time_bucket(5m, timestamp) AS bucket,
avg(value), min(value), max(value)
FROM pp.tm_tag_point
WHERE tag_id = 'TAG-001'
AND timestamp >= '2026-07-01' AND timestamp < '2026-07-02'
GROUP BY tag_id, time_bucket(5m, timestamp);
Lücken füllen, damit das Diagramm keine Löcher zeigt
SELECT time_bucket_gapfill(10m, timestamp, '2026-07-01', '2026-07-01 06:00'),
interpolate(avg(value))
FROM pp.tm_tag_point
WHERE tag_id = 'TAG-001'
AND timestamp >= '2026-07-01' AND timestamp < '2026-07-01 06:00'
GROUP BY tag_id, time_bucket_gapfill(10m, timestamp, '2026-07-01', '2026-07-01 06:00');
locf ist Letzten Wert beibehalten (stufenförmig), interpolate ist lineare Interpolation (gerade Linie).
Für Signale wie Anlagenzustände, die «bis zur nächsten Änderung unverändert bleiben», ist locf richtig, für kontinuierliche physikalische Größen wie Temperatur ist interpolate geeignet.
Stündliche Anstiegsrate eines Produktionszählers
SELECT time_bucket(1h, timestamp) AS bucket,
counter_rate(value, timestamp) * 3600 AS per_hour
FROM pp.tm_tag_point
WHERE tag_id = 'COUNTER-01'
AND timestamp >= '2026-07-01' AND timestamp < '2026-07-02'
GROUP BY tag_id, time_bucket(1h, timestamp);
p95 der Antwortverzögerung
SELECT time_bucket(1h, timestamp), percentile(value, 0.95)
FROM pp.tm_tag_point
WHERE tag_id = 'LATENCY-01'
AND timestamp >= '2026-07-01' AND timestamp < '2026-07-02'
GROUP BY tag_id, time_bucket(1h, timestamp);
Korrelation zweier Tags anzeigen
SELECT corr(a.value, b.value)
FROM pp.tm_tag_point_pair
WHERE pair_id = 'TEMP-VS-POWER'
AND timestamp >= '2026-07-01' AND timestamp < '2026-07-08';
Wissenswertes
- Verwenden Sie die Funktionen erst nachdem Sie die Partition eingeschränkt haben.
WHEREmit Partitionsschlüssel (normalerweisetag_id) und Zeitbereich ist die Voraussetzung — ohne dies werden alle Knoten durchsucht. - In
GROUP BYgeben Sie Partitionsschlüssel und Bucket-Funktion zusammen an (GROUP BY tag_id, time_bucket(...)). - Die Gap-Fill-Parameter
시작·끝müssen mit dem Zeitbereich vonWHEREübereinstimmen. Wenn sie abweichen, entstehen Buckets in unerwünschten Bereichen.
Siehe auch
- Abfragen mit CQL — Verbindung und Grundsyntax
- Gestufte Speicherung — Komprimierte Vergangenheit lässt sich mit derselben Abfrage lesen