Zum Hauptinhalt springen

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.

Häufigste Verwendungsform
-- 시간별 평균, 빈 버킷은 직전 값으로 채운다
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​

FunktionSignaturRückgabewertBeschreibung
time_buckettime_bucket(간격, ts [, 기준시각])timestampStartzeit des Buckets. Skalar für das Downsampling
time_bucket_gapfilltime_bucket_gapfill(폭, ts, 시작, 끝)timestampFür GROUP BY. Erzeugt auch leere Buckets
locflocf(집계)Gleicher Typ wie die ArgumenteFüllt leere Buckets mit dem letzten bekannten Wert (Last Observation Carried Forward)
interpolateinterpolate(집계)doubleFüllt leere Buckets durch lineare Interpolation zwischen Vorder- und Rückwärtswert

Wertextraktion und Änderungsraten​

FunktionSignaturBeschreibung
first / lastfirst(값, ts) / last(값, ts)Zeitlich frühester / spätester Wert
deltadelta(값, ts)Letzter − Erster
raterate(값, ts)delta ÷ verstrichene Sekunden (bezogen auf die beiden Endpunkte)
derivativederivative(값, ts)Steigung der Kleinstquadrat-Regression, pro Sekunde
counter_delta / counter_rate(값, ts)Kumulierter Zähleranstieg / Anstiegsrate pro Sekunde. Berücksichtigt einen Reset
Verwenden Sie counter_* für kumulative Zähler

Wenn 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​

FunktionSignaturBeschreibung
percentilepercentile(값, 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 unterschiedlich

Wenn 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​

FunktionBeschreibung
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. WHERE mit Partitionsschlüssel (normalerweise tag_id) und Zeitbereich ist die Voraussetzung — ohne dies werden alle Knoten durchsucht.
  • In GROUP BY geben Sie Partitionsschlüssel und Bucket-Funktion zusammen an (GROUP BY tag_id, time_bucket(...)).
  • Die Gap-Fill-Parameter 시작·끝 müssen mit dem Zeitbereich von WHERE übereinstimmen. Wenn sie abweichen, entstehen Buckets in unerwünschten Bereichen.

Siehe auch​