类别:

查询语法

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) 列中,其中 1743447600 等效于 2025-3-31 12:00:00

INCREMENT BY time_series_constant

根据 USING 列的数据类型,指定 INTERVAL 常量或数值常量。这个常量代表每个时间间隔的宽度。切片相对于 1970 年 1 月 1 日午夜 (1970-01-01 00:00:00) 对齐。TIME_SLICE 函数使用相同的对齐方式;有关更多信息,请参阅 TIME_SLICE 使用说明

  • 当 USING 参数指定日期或时间列时,INCREMENT BY 表达式必须是 INTERVAL 常量

  • 当 USING 参数指定数值列时,INCREMENT BY 表达式也必须是数值。

生成的时间序列的起点基于 time_series_constant 的最小时间。

如果此常量是数值常数,则必须为正数(大于 0)。

可选参数

[ AS ] alias_name

为对象引用指定替代名称。别名可以在 FROM 子句中的任何其他分子句中使用。别名必须遵循 对象标识符 的规则。

PARTITION BY partition_column

在一个或多个输入列上对结果集进行分区,并在每个分区内生成新行。

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

向重采样的结果集中添加一个或多个元数据列。要添加列,请调用以下一个或两个函数:

IS_GENERATED()

向结果集添加 is_generated 列,标记哪些行是新的(由 RESAMPLE 操作生成)以及哪些行已经存在。

BUCKET_START()

向结果集添加 bucket_start 列。该列根据 USING 子句中指定的列中的值返回值,标记 RESAMPLE 操作生成的当前桶或间隔的开始。重采样后,您可以使用 BUCKET_START 列来确定特定行属于哪个间隔。

如果您指定两个元数据列,请使用逗号将它们分开。

生成的列可以有别名。别名必须遵循 对象标识符 的规则。

使用说明

  • INCREMENT BY 子句中的 INTERVAL 常量具有以下要求:

    • 该常量必须等于或大于 1 second。不支持较小的单位(millisecondmicrosecondnanosecond)。

    • 当 USING 列是 DATE 数据类型时,您不能在间隔中指定比 day``(``hourminutesecond)更精细的单位。例如,不允许使用常量 'INTERVAL 1 day, 2 hours''INTERVAL 25 hours'

    • 为避免含糊不清,某些日期部分不能混用。支持的日期部分分为三组:

      • yearquartermonth

      • week

      • dayhourminutesecond

      例如,不允许使用跨越这些组边界的以下间隔:

      • INTERVAL '1 week, 3 days'

      • INTERVAL '2 weeks, 12 hours'

      • INTERVAL '3 months, 1 week'

  • 就联接而言,RESAMPLE 构造的工作方式与 SAMPLE / TABLESAMPLE 构造类似。重采样仅适用于一个表,而不适用于 RESAMPLE 子句之前的所有表或整个表达式。要对联接的结果进行重采样,请使用子查询进行联接,然后对结果表进行重采样。请参阅 联接采样

  • 在应用 RESAMPLE 子句条件之前对 WHERE 子句进行评估。如果要对筛选后的数据集进行重采样,请先对其进行筛选(例如,通过创建一个可以重采样的新表或使用首先在主 RESAMPLE 查询中计算的子查询)。以下查询对整个表进行重采样,然后为 AtlantaBoston 丢弃除行之外的所有内容。

    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 时间戳。该数值列在 RESAMPLE 子句中指定为 USING 列。创建并加载下表:

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_rowbucket_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 天间隔递增的重采样结果集的情况下,该查询计算每个城市具有相同桶开始时间的观测次数。要运行此示例,请创建 march_temps 表,如 使用 RESAMPLE 子句 中所述。

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 分钟间隔的两个原始行(值为 09:49:0010:18:00 的行)。

语言: 中文