カテゴリ:

クエリ構文

RESAMPLE

ユーザー定義の時間ベースの粒度で、データポイントが欠落している入力行と生成された行の両方を含むデータセットを返します。

構文

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

必須パラメーター

FROM object_reference

サブクエリなど、入力データセットを含むテーブルまたは別のオブジェクト参照の名前を指定します。オブジェクト参照の詳細については、FROM をご参照ください。

USING time_series_column

時系列の時間ベース値を含む列を指定します。列は 日付と時刻のデータ型 または 数値データ型 である必要があります。たとえば、UNIX のタイムスタンプ値は NUMBER(38,0)列に保存されます。17434476002025-3-31 12:00:00 と同等です。

INCREMENT BY time_series_constant

USING 列のデータ型に応じて、INTERVAL 定数または数値定数を指定します。この定数は、各時間間隔の幅を表します。そのスライスは、1970年1月1日午前0時(1970-01-01 00:00:00)を基準にして整列されます。その TIME_SLICE 関数は同じアライメントを使用します。詳細については、TIME_SLICE:ref:` 使用上の注意 <label-time_slice_usage_notes>` をご参照ください。

  • USING パラメーターが日付または時刻列を指定している場合、INCREMENTBY 式は INTERVAL 定数 である必要があります。

  • USING パラメーターが数値列を指定している場合、INCREMENTBY 式も数値である必要があります。

生成された時系列の開始点は、time_series_constant の最小時間に基づきます。

この定数が数値定数の場合は、正(0より大きい)である必要があります。

オプションのパラメーター

[ AS ] alias_name

オブジェクト参照の代替名を指定します。エイリアスは、FROM 句内の他の副次句で使用できます。エイリアス名は オブジェクト識別子 のルールに従う必要があります。

PARTITION BY partition_column

結果セットを1つ以上の入力列でパーティション分割し、各パーティション内に新しい行を生成します。

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

リサンプリングされた結果セットに1つ以上のメタデータ列を追加します。列を追加するには、次の関数の一方または両方を呼び出します。

IS_GENERATED()

どの行が新しいか(RESAMPLE 操作によって生成)、どの行がすでに存在しているかをマークする結果セットに is_generated 列を追加します。

BUCKET_START()

bucket_start 列を結果セットに追加します。この列は、RESAMPLE 操作が生成する現在のバケットまたは間隔の開始を示す値を返します。これは USING 句で指定された列の値に基づいています。BUCKET_START 列を使用して、リサンプリング後に特定の行がどの間隔に属するかを識別できます。

両方のメタデータ列を指定する場合は、コンマで区切ります。

生成された列はエイリアスを持つことができます。エイリアス名は オブジェクト識別子 のルールに従う必要があります。

使用上の注意

  • INCREMENTBY 句の INTERVAL 定数には次のような要件があります。

    • 定数は1 second 以上である必要があります。それより小さい単位(millisecondmicrosecondnanosecond)はサポートされていません。

    • USING 列が DATE データ型である場合、day``よりも細かい間隔の単位(``hourminutesecond)を指定することはできません。たとえば、定数 'INTERVAL 1 day, 2 hours' および 'INTERVAL 25 hours' は許可されていません。

    • あいまいさを避けるため、特定の日付部分は混在できません。サポートされている日付部分は、次の3つの個別のグループに分類されます。

      • yearquartermonth

      • week

      • dayhourminutesecond

      たとえば、これらのグループの境界を越える次の間隔は許可されていません。

      • INTERVAL '1 week, 3 days'

      • INTERVAL '2 weeks, 12 hours'

      • INTERVAL '3 months, 1 week'

  • 結合に関して、RESAMPLE 構造は SAMPLE / TABLESAMPLE 構造と同じ方法で機能します。リサンプリングは1つのテーブルのみに適用され、先行するすべてのテーブルまたは RESAMPLE 句の前の式全体には適用されません。結合の結果をリサンプリングするには、結合にサブクエリを使用してから、結果のテーブルをリサンプリングします。結合によるサンプリング をご参照ください。

  • その RESAMPLE 句は WHERE 句の条件が適用される前に評価されます。フィルタリングされたデータセットをリサンプリングする場合は、最初にフィルタリングします(たとえば、リサンプリングできる新しいテーブルを作成するか、メインの RESAMPLE クエリ内で最初に計算されるサブクエリを使用する)。次のクエリは、テーブル全体をリサンプリングし、Atlanta および 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

    サブクエリを使用した潜在的な書き換えは次のようになります。

    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

次の例は、クエリで RESAMPLE 構造を使用する方法を示しています。

数値列を使用する RESAMPLE の例

次の例ではソーステーブルに UNIX タイムスタンプがあります。この数値列は USING 列として RESAMPLE 句で指定されます。次のテーブルを作成してロードします。

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

次の RESAMPLE クエリを実行します。

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 |
+-----------+------------+----------+-----------+-----------+

USING 列が数値である場合、INCREMENT BY 式は正の数値定数でなければならないため、次のクエリは失敗します。

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 の例

次の例は、march_temps テーブル(RESAMPLE 句の使用 で作成)をリサンプリングし、結果に generated_row および bucket_start という名前のメタデータ列が含まれています。

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

次のクエリは、march_temps_every_five_mins テーブルから生成された行のみを返します。

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 |
+-------------------------+-------------+------------------+----------------+---------------+-------------------------+

BUCKET_START() を使用してリサンプリングされた行を集計する RESAMPLE の例

次の例では、bucket_start メタデータ列を使用してリサンプリングされた行を集約しています。クエリは、1日間隔で増えるリサンプリングされた結果セットを考慮して、同じバケットの開始時間を持つ都市ごとの観測の数をカウントします。この例を実行するには、RESAMPLE 句の使用 で説明されているように march_temps テーブルを作成します。

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 |
+-------------------------+----------------+----------+

BUCKET_START() を使用して不均一な行を除外する RESAMPLE の例

bucket_start メタデータ列を使用して、リサンプリングされた結果セットから不均一データを除外することができます。例:

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

このクエリはテーブルをリサンプリングし、5分間隔に準拠していない2つの元の行(09:49:00 および 10:18:00 値を持つ行)を削除します。