Categorias:

Sintaxe de consulta

RESAMPLE

Retorna um conjunto de dados que inclui linhas de entrada e linhas geradas para pontos de dados ausentes, considerando uma granularidade baseada em tempo definida pelo usuário.

Sintaxe

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

Parâmetros obrigatórios

FROM object_reference

Especifica o nome de uma tabela ou outra referência de objeto que contém o conjunto de dados de entrada, como uma subconsulta. Para obter mais informações sobre referências de objetos, consulte FROM.

USING time_series_column

Especifica a coluna que contém valores baseados em tempo na série temporal. A coluna deve ser um tipo de dado de data e hora ou um tipo de dado numérico. Por exemplo, valores de carimbo de data/hora UNIX podem ser armazenados em colunas NUMBER(38,0), em que 1743447600 é equivalente a 2025-3-31 12:00:00.

INCREMENT BY time_series_constant

Especifica uma constante INTERVAL ou uma constante numérica, dependendo do tipo de dado da coluna USING. Essa constante representa a largura de cada intervalo de tempo. Os segmentos são alinhados em relação à meia-noite de 1º de janeiro de 1970 (1970-01-01 00:00:00). A função TIME_SLICE usa o mesmo alinhamento; para obter mais informações, consulte as TIME_SLICE notas de uso.

  • Quando o parâmetro USING especifica uma coluna de data ou hora, a expressão INCREMENT BY deve ser uma constante INTERVAL.

  • Quando o parâmetro USING especifica uma coluna numérica, a expressão INCREMENT BY também deve ser numérica.

O ponto de partida para uma série temporal gerada é baseado no tempo mínimo de time_series_constant.

Se essa constante for numérica, ela deve ser positiva (maior que 0).

Parâmetros opcionais

[ AS ] alias_name

Especifica um nome alternativo para a referência do objeto. O alias pode ser utilizado em qualquer outra subcláusula dentro da cláusula FROM. Os nomes de alias devem seguir as regras de Identificadores de objetos.

PARTITION BY partition_column

Particiona o conjunto de resultados em uma ou mais colunas de entrada e gera novas linhas dentro de cada partição.

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

Adiciona uma ou mais colunas de metadados ao conjunto de resultados reamostrado. Para adicionar as colunas, chame uma ou ambas as funções a seguir:

IS_GENERATED()

Adiciona uma coluna is_generated ao conjunto de resultados que marca quais linhas são novas (geradas pela operação RESAMPLE) e ​​quais já existiam.

BUCKET_START()

Adiciona uma coluna bucket_start ao conjunto de resultados. Essa coluna retorna o valor que marca o início do intervalo ou bucket atual produzido pela operação RESAMPLE, com base nos valores na coluna especificada na cláusula USING. Você pode usar a coluna BUCKET_START para identificar a qual intervalo uma linha específica pertence após a reamostragem.

Se você especificar ambas as colunas de metadados, separe-as com uma vírgula.

As colunas geradas podem ter aliases. Os nomes de alias devem seguir as regras de Identificadores de objetos.

Notas de uso

  • Uma constante INTERVAL na cláusula INCREMENT BY tem os seguintes requisitos:

    • A constante deve ser igual ou maior que um second. Unidades menores (millisecond, microsecond, nanosecond) não são aceitas.

    • Quando a coluna USING é um tipo de dado DATE, não é possível especificar uma unidade no intervalo que seja mais granular que day (hour, minute, second). Por exemplo, as constantes 'INTERVAL 1 day, 2 hours' e 'INTERVAL 25 hours' não são permitidas.

    • Para evitar ambiguidade, certas partes de data não podem ser misturadas. As partes de data aceitas se enquadram em três grupos discretos:

      • year, quarter, month

      • week

      • day, hour, minute, second

      Por exemplo, os seguintes intervalos, que cruzam esses limites de grupo, não são permitidos:

      • INTERVAL '1 week, 3 days'

      • INTERVAL '2 weeks, 12 hours'

      • INTERVAL '3 months, 1 week'

  • Com relação às junções, a construção RESAMPLE funciona de maneira semelhante à SAMPLE / TABLESAMPLE. A reamostragem se aplica a apenas uma tabela, não a todas as tabelas anteriores ou à expressão inteira anterior à cláusula RESAMPLE. Para fazer uma nova amostragem do resultado de uma junção, use uma subconsulta para a junção e, em seguida, reamostre a tabela resultante. Consulte Amostragem com junções.

  • A cláusula RESAMPLE é avaliada antes da aplicação das condições da cláusula WHERE. Se você quiser fazer uma nova amostragem de um conjunto de dados filtrado, filtre-o primeiro (por exemplo, criando uma nova tabela que possa ser reamostrada ou usando uma subconsulta que seja computada primeiro dentro da consulta RESAMPLE principal). A consulta a seguir faz uma nova amostragem de toda a tabela e, em seguida, descarta tudo, exceto as linhas de Atlanta e 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

    Uma possível reescrita com uma subconsulta seria:

    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

Exemplos

Os exemplos a seguir mostram como usar a construção RESAMPLE em consultas.

Exemplo de RESAMPLE que usa uma coluna numérica

O exemplo a seguir tem um carimbo de data/hora UNIX na tabela de origem. Essa coluna numérica é especificada na cláusula RESAMPLE como a coluna USING. Crie e carregue a seguinte tabela:

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

Agora execute a seguinte consulta 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 |
+-----------+------------+----------+-----------+-----------+

A consulta a seguir falha porque a expressão INCREMENT BY deve ser uma constante numérica positiva quando a coluna USING é numérica:

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.

Exemplo de RESAMPLE que retorna apenas as linhas geradas

O exemplo a seguir faz uma nova amostragem da tabela march_temps (conforme criada em Como usar a cláusula RESAMPLE) e ​​inclui colunas de metadados denominadas generated_row e bucket_start no resultado:

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

A consulta a seguir retorna apenas as linhas geradas da tabela 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 |
+-------------------------+-------------+------------------+----------------+---------------+-------------------------+

Exemplo de RESAMPLE que usa BUCKET_START() para agregar linhas reamostradas

O exemplo a seguir usa a coluna de metadados bucket_start para agregar linhas reamostradas. A consulta conta o número de observações por cidade que têm o mesmo horário de início do intervalo, dado um conjunto de resultados reamostrados que é incrementado em um intervalo de um dia. Para executar esse exemplo, crie a tabela march_temps, conforme descrito em Como usar a cláusula 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 |
+-------------------------+----------------+----------+

Exemplo de RESAMPLE que usa BUCKET_START() para filtrar linhas não uniformes

Você pode usar a coluna de metadados bucket_start para filtrar dados não uniformes de um conjunto de resultados reamostrado. Por exemplo:

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

Essa consulta faz uma nova amostragem a tabela e, em seguida, remove duas linhas originais que não estão em conformidade com o intervalo de cinco minutos (aquelas com os valores 09:49:00 e 10:18:00).