Kategorien:

Abfragesyntax

RESAMPLE

Gibt ein Datenset zurück, das sowohl Eingabe als auch generierte Zeilen für fehlende Datenpunkte enthält, wobei eine benutzerdefinierte zeitbasierte Granularität angegeben wurde.

Syntax

FROM <object_reference> [ [ AS ] <alias_name> ]
  RESAMPLE(
    USING <time_series_column>
    INCREMENT BY <time_series_constant>
    [ PARTITION BY <partition_column> [ , ... ] ]
    [ METADATA_COLUMNS
        { IS_GENERATED() | BUCKET_START() } [ [ AS ] <alias_name> ] [ , ... ] ]
    )
Copy

Erforderliche Parameter

FROM object_reference

Gibt den Namen einer Tabelle oder einer anderen Objektreferenz an, die das Eingabe-Dataset enthält, z. B. eine Unterabfrage. Weitere Informationen zu Objektreferenzen finden Sie unter FROM.

USING time_series_column

Gibt die Spalte an, die zeitbasierte Werte der Zeitreihe enthält. Die Spalte muss ein Datentyp für Datum und Uhrzeit oder ein numerischer Datentyp sein. Beispiel: UNIX Zeitstempelwerte können in NUMBER(38,0)-Spalten gespeichert sein, wobei 1743447600 äquivalent zu 2025-3-31 12:00:00 ist.

INCREMENT BY time_series_constant

Gibt eine INTERVAL-Konstante oder eine numerische Konstante abhängig vom Datentyp der USING-Spalte an. Diese Konstante steht für die Breite jedes Zeitintervalls. Alle Segmente sind relativ zu Mitternacht am 1. Januar 1970 (1970-01-01 00:00:00) ausgerichtet. Die TIME_SLICE-Funktion verwendet die gleiche Ausrichtung. Weitere Informationen dazu finden Sie in den Nutzungshinweisen zu TIME_SLICE.

  • Wenn der USING-Parameter eine Datums- oder Zeitspalte angibt, muss der INCREMENT BY-Ausdruck muss eine INTERVAL-Konstante sein.

  • Wenn der USING-Parameter eine numerische Spalte angibt, muss der INCREMENT BY-Ausdruck ebenfalls numerisch sein.

Der Startpunkt für eine generierte Zeitreihe basiert auf der Mindestzeit der time_series_constant.

Wenn diese Konstante eine numerische Konstante ist, muss sie positiv sein (größer als 0).

Optionale Parameter

[ AS ] alias_name

Gibt einen alternativen Namen für die Objektreferenz an. Der Alias kann in jeder anderen Unterklausel innerhalb der FROM-Klausel verwendet werden. Aliasnamen müssen den Regeln für Objektbezeichner folgen.

PARTITION BY partition_column

Partitioniert das Resultset für eine oder mehrere Eingaben und generiert in jeder Partition neue Zeilen.

METADATA_COLUMNS {function} [ [ AS ] {alias_name} ]

Fügt eine oder mehrere Metadatenspalten zum Resultset hinzu. Um die Spalten hinzuzufügen, rufen Sie eine oder beide der folgenden Funktionen auf:

IS_GENERATED()

Fügt eine is_generated-Spalte für das Resultset hinzu, das markiert, welche Zeilen neu sind (generiert von der RESAMPLE-Operation) und welche Zeilen bereits vorhanden waren.

BUCKET_START()

Fügt eine bucket_start-Spalte zum Resultset hinzu. Diese Spalte gibt den Wert zurück, der den Beginn des aktuellen Bucket oder Intervalls markiert, das dieRESAMPLE-Operation erzeugt, basierend auf den Werten in der in der USING-Klausel angegebenen Spalte. Sie können die BUCKET_START-Spalte verwenden, um zu identifizieren, zu welchem Intervall eine bestimmte Zeile nach dem Resampling gehört.

Wenn Sie beide Spalten für die Metadaten angeben, trennen Sie diese durch ein Komma.

Generierte Spalten können Aliasse haben. Aliasnamen müssen den Regeln für Objektbezeichner folgen.

Nutzungshinweise

  • Eine INTERVAL-Konstante in der INCREMENT BY-Klausel hat folgende Anforderungen:

    • Die Konstante muss gleich oder größer als eine``second`` sein. Kleinere Einheiten (millisecond, microsecond, nanosecond) werden nicht unterstützt.

    • Wenn die USING-Spalte ein DATE-Datentyp ist, können Sie keine Einheit im Intervall angeben, die detaillierter als day (hour, minute, second) ist. Die Konstanten 'INTERVAL 1 day, 2 hours' und 'INTERVAL 25 hours' sind beispielsweise nicht erlaubt.

    • Um Mehrdeutigkeiten zu vermeiden, können bestimmte Datumskomponenten nicht gemischt werden. Die unterstützten Datumskomponenten lassen sich in drei Gruppen unterteilen:

      • year, quarter, month

      • week

      • day, hour, minute, second

      Die folgenden Intervalle, die diese Gruppengrenzen überschreiten, sind beispielsweise nicht erlaubt:

      • INTERVAL '1 week, 3 days'

      • INTERVAL '2 weeks, 12 hours'

      • INTERVAL '3 months, 1 week'

  • In Bezug auf Verknüpfungen funktioniert das RESAMPLE-Konstrukt auf ähnliche Weise wie das SAMPLE / TABLESAMPLE-Konstrukt. Das Resampling gilt nur für eine Tabelle, nicht für alle vorhergehenden Tabellen oder den gesamten Ausdruck vor der RESAMPLE-Klausel. Um für das Ergebnis einer Verknüpfung ein Resampling auszuführen, verwenden Sie eine Unterabfrage für die Verknüpfung und führen dann ein Resampling der resultierenden Tabelle aus. Siehe Sampling mit Joins.

  • Die RESAMPLE-Klausel wird ausgewertet, bevor die Bedingungen der WHERE-Klausel angewendet werden. Wenn Sie für ein gefiltertes Dataset ein Resampling ausführen möchten, filtern Sie es zuerst (z. B. indem Sie eine neue Tabelle für das Resampling erstellen oder indem Sie eine Unterabfrage verwenden, die zuerst innerhalb der RESAMPLE-Hauptabfrage berechnet wird). Die folgende Abfrage führt ein Resampling für die gesamte Tabelle aus und verwirft dann alles bis auf die Zeilen für Atlanta und Boston.

    SELECT *
      FROM heavy_weather
        RESAMPLE(
          USING start_time
          INCREMENT BY INTERVAL '1 day')
      WHERE city IN('Atlanta','Boston')
      ORDER BY start_time, city, county;
    
    Copy

    Ein mögliches Umschreiben mit einer Unterabfrage sähe wie folgt aus:

    SELECT *
      FROM (SELECT * FROM heavy_weather WHERE city IN('Atlanta','Boston'))
        RESAMPLE(
          USING start_time
          INCREMENT BY INTERVAL '1 day')
      ORDER BY start_time, city, county;
    
    Copy

Beispiele

Die folgenden Beispiele zeigen die Verwendung des RESAMPLE-Konstrukts in Abfragen.

RESAMPLE-Beispiel, das eine numerische Spalte verwendet

Das folgende Beispiel hat einen UNIX-Zeitstempel in der Quelltabelle. Diese numerische Spalte wird in der RESAMPLE-Klausel als die USING-Spalte angegeben. Erstellen und laden Sie die folgende Tabelle:

CREATE OR REPLACE TABLE sensor_data_unixtime (device_id VARCHAR(10), unixtime NUMBER(38,0), avg_temp NUMBER(6,4), vibration NUMBER (5,4), motor_rpm INT);

INSERT INTO sensor_data_unixtime VALUES
  ('DEVICE3', 1696150802, 36.1103, 0.4226, 1560),
  ('DEVICE3', 1696150803, 35.2987, 0.4326, 1561),
  ('DEVICE3', 1696150804, 40.0001, 0.3221, 1562),
  ('DEVICE3', 1696150805, 38.0422, 0.3333, 1589),
  ('DEVICE3', 1696150807, 33.1524, 0.4865, 1499),
  ('DEVICE3', 1696150808, 32.0422, 0.4221, 1498),
  ('DEVICE3', 1696150809, 31.1519, 0.4751, 1600),
  ('DEVICE3', 1696150810, 29.1524, 0.4639, 1605),
  ('DEVICE3', 1696150812, 35.2987, 0.4336, 1585),
  ('DEVICE3', 1696150813, 40.0000, 0.4226, 1560)
;
Copy

Führen Sie nun die folgende RESAMPLE-Abfrage aus:

SELECT * FROM sensor_data_unixtime
  RESAMPLE(USING unixtime INCREMENT BY 1) ORDER BY unixtime;
Copy
+-----------+------------+----------+-----------+-----------+
| DEVICE_ID |   UNIXTIME | AVG_TEMP | VIBRATION | MOTOR_RPM |
|-----------+------------+----------+-----------+-----------|
| DEVICE3   | 1696150802 |  36.1103 |    0.4226 |      1560 |
| DEVICE3   | 1696150803 |  35.2987 |    0.4326 |      1561 |
| DEVICE3   | 1696150804 |  40.0001 |    0.3221 |      1562 |
| DEVICE3   | 1696150805 |  38.0422 |    0.3333 |      1589 |
| DEVICE3   | 1696150806 |     NULL |      NULL |      NULL |
| DEVICE3   | 1696150807 |  33.1524 |    0.4865 |      1499 |
| DEVICE3   | 1696150808 |  32.0422 |    0.4221 |      1498 |
| DEVICE3   | 1696150809 |  31.1519 |    0.4751 |      1600 |
| DEVICE3   | 1696150810 |  29.1524 |    0.4639 |      1605 |
| DEVICE3   | 1696150811 |     NULL |      NULL |      NULL |
| DEVICE3   | 1696150812 |  35.2987 |    0.4336 |      1585 |
| DEVICE3   | 1696150813 |  40.0000 |    0.4226 |      1560 |
+-----------+------------+----------+-----------+-----------+

Die folgende Abfrage schlägt fehl, weil der INCREMENT BY-Ausdruck eine positive numerische Konstante sein muss, wenn die USING-Spalte numerisch ist:

SELECT * FROM sensor_data_unixtime
  RESAMPLE(USING unixtime INCREMENT BY INTERVAL '1 second') ORDER BY unixtime;
Copy
009954 (42601): SQL compilation error:
RESAMPLE INCREMENT BY has to be numeric type when USING parameter is numeric.

RESAMPLE-Beispiel, das nur generierte Zeilen zurückgibt

Das folgende Beispiel zeigt ein Resampling der march_temps-Tabelle (wie in Verwenden der RESAMPLE-Klausel erstellt) und enthält Metadatenspalten mit dem Namen generated_row und bucket_start im Ergebnis:

CREATE OR REPLACE TABLE march_temps_every_five_mins AS
  SELECT * FROM march_temps
    RESAMPLE(
      USING observed
      INCREMENT BY INTERVAL '5 minutes'
      PARTITION BY city, county
      METADATA_COLUMNS IS_GENERATED() AS generated_row, BUCKET_START()
      )
  ORDER BY observed;
Copy

Die folgende Abfrage gibt nur die generierten Zeilen aus der march_temps_every_five_mins-Tabelle zurück:

SELECT * FROM march_temps_every_five_mins
  WHERE generated_row = 'True';
Copy
+-------------------------+-------------+------------------+----------------+---------------+-------------------------+
| OBSERVED                | TEMPERATURE | CITY             | COUNTY         | GENERATED_ROW | BUCKET_START            |
|-------------------------+-------------+------------------+----------------+---------------+-------------------------|
| 2025-03-15 09:45:00.000 |        NULL | Big Bear City    | San Bernardino | True          | 2025-03-15 09:45:00.000 |
| 2025-03-15 09:50:00.000 |        NULL | Big Bear City    | San Bernardino | True          | 2025-03-15 09:50:00.000 |
| 2025-03-15 10:00:00.000 |        NULL | South Lake Tahoe | El Dorado      | True          | 2025-03-15 10:00:00.000 |
| 2025-03-15 10:00:00.000 |        NULL | Big Bear City    | San Bernardino | True          | 2025-03-15 10:00:00.000 |
| 2025-03-15 10:05:00.000 |        NULL | South Lake Tahoe | El Dorado      | True          | 2025-03-15 10:05:00.000 |
| 2025-03-15 10:05:00.000 |        NULL | Big Bear City    | San Bernardino | True          | 2025-03-15 10:05:00.000 |
| 2025-03-15 10:15:00.000 |        NULL | Big Bear City    | San Bernardino | True          | 2025-03-15 10:15:00.000 |
+-------------------------+-------------+------------------+----------------+---------------+-------------------------+

RESAMPLE-Beispiel, das BUCKET_START() zum Aggregieren neu gesampelter Zeilen verwendet

Im folgenden Beispiel wird die bucket_start-Metadatenspalte verwendet, um neu gesampelte Zeilen zu aggregieren. Die Abfrage zählt die Anzahl der Beobachtungen pro Stadt, die dieselbe Bucket-Startzeit haben, bei einem geänderten Resultset, das um ein 1-Tages-Intervall erhöht wird. Um dieses Beispiel auszuführen, erstellen Sie die march_temps-Tabelle, wie unter Verwenden der RESAMPLE-Klausel beschrieben.

SELECT bucket_start, county, COUNT(*)
  FROM march_temps
    RESAMPLE(
      USING observed
      INCREMENT BY INTERVAL '1 day'
      METADATA_COLUMNS IS_GENERATED(), BUCKET_START()
      )
  WHERE IS_GENERATED = 'False'
  GROUP BY bucket_start, county;
Copy
+-------------------------+----------------+----------+
| BUCKET_START            | COUNTY         | COUNT(*) |
|-------------------------+----------------+----------|
| 2025-03-15 00:00:00.000 | El Dorado      |        4 |
| 2025-03-15 00:00:00.000 | San Bernardino |        4 |
+-------------------------+----------------+----------+

RESAMPLE-Beispiel, das BUCKET_START() zum Herausfiltern uneinheitlicher Zeilen verwendet

Sie können die bucket_start-Metadatenspalte verwenden, um uneinheitliche Daten aus neu gesampelten Resultset herauszufiltern. Beispiel:

SELECT *
  FROM march_temps
    RESAMPLE(
      USING observed
      INCREMENT BY INTERVAL '5 minutes'
      METADATA_COLUMNS BUCKET_START() AS bucket_first_row
      )
  WHERE observed = bucket_first_row
  ORDER BY observed;
Copy

Diese Abfrage führt ein Resampling für die Tabelle aus und entfernt dann zwei ursprüngliche Zeilen, die nicht mit dem 5-Minuten-Intervall übereinstimmen (Zeilen mit den Werten 09:49:00 und 10:18:00).