- Categorias:
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> ] [ , ... ] ]
)
Parâmetros obrigatórios¶
FROM object_referenceEspecifica 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_columnEspecifica 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 a2025-3-31 12:00:00.INCREMENT BY time_series_constantEspecifica 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_nameEspecifica 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_columnParticiona 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_generatedao 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_startao 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,monthweekday,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
AtlantaeBoston.SELECT * FROM heavy_weather RESAMPLE( USING start_time INCREMENT BY INTERVAL '1 day') WHERE city IN('Atlanta','Boston') ORDER BY start_time, city, county;
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;
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)
;
Agora execute a seguinte consulta RESAMPLE:
SELECT * FROM sensor_data_unixtime
RESAMPLE(USING unixtime INCREMENT BY 1) ORDER BY unixtime;
+-----------+------------+----------+-----------+-----------+
| 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;
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;
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';
+-------------------------+-------------+------------------+----------------+---------------+-------------------------+
| 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;
+-------------------------+----------------+----------+
| 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;
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).