Uma consulta de downsampling é uma consulta agregada ao longo do tempo. Ela é comumente usada em aplicações de séries temporais para reduzir a taxa de amostragem dos dados.
Mecanismos e versões
As consultas de downsampling são suportadas apenas pelo LindormTSDB 3.4.15 e versões posteriores.
Para obter mais informações, visualize a versão do LindormTSDB da instância do Lindorm e atualize-a, conforme descrito em Release notes of LindormTSDB e Upgrade the minor engine version of a Lindorm instance.
Sintaxe
select_sample_by_statement ::= SELECT ( select_clause | '*' )
FROM table_identifier
WHERE where_clause
SAMPLE BY time_interval [ OFFSET offset_interval ] [ FILL fill_option ]
select_clause ::= selector [ AS identifier ] ( ',' selector [ AS identifier ] )
selector ::= tag_identifier | time | function_identifier '(' field_identifier [ ',' function_args ] ')'
where_clause ::= relation ( AND relation )*
relation ::= ( field_identifier | tag_identifier ) operator term
operator ::= '=' | '<' | '>' | '<=' | '>=' | '!=' | IN | CONTAINS | CONTAINS KEY
time_interval ::= interval units | 0
offset_interval ::= interval units
Funções de agregação suportadas
A cláusula SAMPLE BY executa uma operação de downsampling em cada série temporal individual. Para obter mais informações sobre séries temporais, consulte data model.
A cláusula SAMPLE BY oferece suporte às seguintes funções de agregação:
|
Função |
Descrição |
|
Calcula a soma dos valores dentro de cada janela de tempo especificada. |
|
|
Calcula a média dos valores dentro de cada janela de tempo especificada. |
|
|
Conta o número de valores dentro de cada janela de tempo especificada. |
|
|
Encontra o valor mínimo dentro de cada janela de tempo especificada. |
|
|
Encontra o valor máximo dentro de cada janela de tempo especificada. |
|
|
Retorna o primeiro valor dentro de cada janela de tempo especificada. |
|
|
Retorna o último valor dentro de cada janela de tempo especificada. |
|
|
Calcula o percentil dos valores dentro de cada janela de tempo especificada. |
|
|
Retorna o valor mais recente em todo o intervalo de tempo. |
|
|
Calcula a taxa de variação entre o valor atual e o valor na linha anterior. |
|
|
Calcula o delta entre o valor atual e o valor na linha anterior. |
As consultas de downsampling suportam filtragem apenas por colunas de tag, e não por colunas de campo. Os filtros em uma coluna de campo são ignorados e podem causar resultados inesperados. Para filtrar por uma coluna de campo, use uma subconsulta para aplicar o filtro aos resultados da consulta de downsampling.
Tomando a função latest(field, n) como exemplo, onde temperature é uma coluna de campo:
SELECT device_id,region,time,temperature FROM (SELECT device_id,region,time,latest(temperature, 2) AS temperature FROM sensor WHERE device_id in ('F07A1260', 'F07A1261') SAMPLE BY 0) WHERE temperature > 45.0;
Exemplos
Em uma consulta SELECT, especifique uma função de agregação para cada coluna de campo, exceto para as colunas de tag.
Os exemplos a seguir usam uma tabela de amostra chamada sensor com o seguinte esquema e dados:
-- Create the sample table sensor.
CREATE TABLE sensor (
device_id VARCHAR NOT NULL,
region VARCHAR NOT NULL,
time TIMESTAMP NOT NULL,
temperature DOUBLE,
humidity BIGINT,
PRIMARY KEY(device_id, region, time)
);
-- Insert data into the table.
UPSERT INTO sensor(device_id, region, time, temperature, humidity) VALUES('F07A1260','north-cn','2021-01-01 09:00:00',0,9);
UPSERT INTO sensor(device_id, region, time, temperature, humidity) VALUES('F07A1260','north-cn','2021-01-01 12:01:00',1,45);
UPSERT INTO sensor(device_id, region, time, temperature, humidity) VALUES('F07A1260','north-cn','2021-01-01 14:03:00',2,46);
UPSERT INTO sensor(device_id, region, time, temperature, humidity) VALUES('F07A1260','north-cn','2021-01-01 20:00:00',10,47);
UPSERT INTO sensor(device_id, region, time, temperature, humidity) VALUES('F07A1261','north-cn','2021-02-10 12:00:30',3,40);
UPSERT INTO sensor(device_id, region, time, temperature, humidity) VALUES('F07A1261','north-cn','2021-03-01 12:01:00',4,41);
UPSERT INTO sensor(device_id, region, time, temperature, humidity) VALUES('F07A1261','north-cn','2021-03-08 12:08:00',5,42);
UPSERT INTO sensor(device_id, region, time, temperature, humidity) VALUES('F07A1261','north-cn','2021-05-01 13:00:00',6,43);
Exemplos de downsampling e subconsultas
Não é possível aninhar uma subconsulta dentro de uma consulta de downsampling, mas você pode usar uma consulta de downsampling como uma subconsulta.
-
Exemplo 1: Execute um downsampling padrão alinhado ao UTC. Esta consulta agrega cada série temporal em janelas de tempo de 8 horas e calcula a contagem para cada janela.
SELECT device_id,region,time,count(humidity) AS count_humidity FROM sensor WHERE device_id='F07A1260' sample by 8h;A consulta retorna o seguinte resultado:
+-----------+----------+---------------------------+----------------+ | device_id | region | time | count_humidity | +-----------+----------+---------------------------+----------------+ | F07A1260 | north-cn | 2021-01-01T08:00:00+08:00 | 3 | | F07A1260 | north-cn | 2021-01-01T16:00:00+08:00 | 1 | +-----------+----------+---------------------------+----------------+ -
Exemplo 2: Execute um downsampling alinhado ao UTC com um deslocamento (offset). Esta consulta agrega cada série temporal em janelas de tempo de 8 horas, desloca o início de cada janela em 3 horas e calcula a contagem.
SELECT device_id,region,time,count(humidity) AS count_humidity FROM sensor WHERE device_id='F07A1260' sample by 8h offset 3h;A consulta retorna o seguinte resultado:
+-----------+----------+---------------------------+----------------+ | device_id | region | time | count_humidity | +-----------+----------+---------------------------+----------------+ | F07A1260 | north-cn | 2021-01-01T03:00:00+08:00 | 1 | | F07A1260 | north-cn | 2021-01-01T11:00:00+08:00 | 2 | | F07A1260 | north-cn | 2021-01-01T19:00:00+08:00 | 1 | +-----------+----------+---------------------------+----------------+ -
Exemplo 3: Execute um downsampling alinhado ao UTC para alinhar com a meia-noite de um fuso horário local. Esta consulta agrega cada série temporal em janelas de tempo de 24 horas e desloca o início em 16 horas para alinhar com 00:00 no fuso horário UTC+08:00. Em seguida, a consulta calcula a contagem.
SELECT device_id,region,time,count(humidity) AS count_humidity FROM sensor WHERE device_id='F07A1260' sample by 24h offset 16hA consulta retorna o seguinte resultado:
+-----------+----------+---------------------------+----------------+ | device_id | region | time | count_humidity | +-----------+----------+---------------------------+----------------+ | F07A1260 | north-cn | 2021-01-01T00:00:00+08:00 | 4 | +-----------+----------+---------------------------+----------------+ -
Exemplo 4: A cláusula
SAMPLE BYnão pode ser usada diretamente comGROUP BY,LIMIT OFFSETouORDER BY. Para usar essas cláusulas, envolva a consultaSAMPLE BYem uma subconsulta.SELECT device_id, max(avg_humidity) AS max_humidity FROM (SELECT device_id,region,time,avg(humidity) AS avg_humidity FROM sensor sample by 8h) group by device_id;A consulta retorna o seguinte resultado:
+-----------+--------------+ | device_id | max_humidity | +-----------+--------------+ | F07A1261 | 43.000000 | | F07A1260 | 47.000000 | +-----------+--------------+ -
Exemplo 5: Use
LIMIT OFFSETem uma consulta externa para limitar o número de resultados de uma subconsulta de downsampling.SELECT device_id,region, avg_humidity FROM (select device_id,region,time,avg(humidity) AS avg_humidity FROM sensor sample by 8h) limit 1 offset 1;A consulta retorna o seguinte resultado:
+-----------+----------+--------------+ | device_id | region | avg_humidity | +-----------+----------+--------------+ | F07A1261 | north-cn | 40.000000 | +-----------+----------+--------------+
Exemplos de downsampling com interpolação
-
Exemplo 1: Interpole dados com um valor fixo.
SELECT * from (select device_id,region,time, avg(humidity) AS humidity FROM sensor WHERE device_id='F07A1260' sample by 2h fill 1) order by device_id;A consulta retorna o seguinte resultado:
+-----------+----------+---------------------------+-----------+ | device_id | region | time | humidity | +-----------+----------+---------------------------+-----------+ | F07A1260 | north-cn | 2021-01-01T08:00:00+08:00 | 9.000000 | | F07A1260 | north-cn | 2021-01-01T10:00:00+08:00 | 1.000000 | | F07A1260 | north-cn | 2021-01-01T12:00:00+08:00 | 45.000000 | | F07A1260 | north-cn | 2021-01-01T14:00:00+08:00 | 46.000000 | | F07A1260 | north-cn | 2021-01-01T16:00:00+08:00 | 1.000000 | | F07A1260 | north-cn | 2021-01-01T18:00:00+08:00 | 1.000000 | | F07A1260 | north-cn | 2021-01-01T20:00:00+08:00 | 47.000000 | +-----------+----------+---------------------------+-----------+ -
Exemplo 2: Interpole dados com o valor da janela de tempo seguinte.
SELECT * from (select device_id,region,time,avg(humidity) AS humidity FROM sensor WHERE device_id='F07A1260' sample by 2h fill after) order by device_id;A consulta retorna o seguinte resultado:
+-----------+----------+---------------------------+-----------+ | device_id | region | time | humidity | +-----------+----------+---------------------------+-----------+ | F07A1260 | north-cn | 2021-01-01T08:00:00+08:00 | 9.000000 | | F07A1260 | north-cn | 2021-01-01T10:00:00+08:00 | 45.000000 | | F07A1260 | north-cn | 2021-01-01T12:00:00+08:00 | 45.000000 | | F07A1260 | north-cn | 2021-01-01T14:00:00+08:00 | 46.000000 | | F07A1260 | north-cn | 2021-01-01T16:00:00+08:00 | 47.000000 | | F07A1260 | north-cn | 2021-01-01T18:00:00+08:00 | 47.000000 | | F07A1260 | north-cn | 2021-01-01T20:00:00+08:00 | 47.000000 | +-----------+----------+---------------------------+-----------+
Exemplos de transformação pós-downsampling
-
Exemplo 1: Faça o downsampling dos dados em janelas de 2 horas usando a função
AVG(). Em seguida, calcule a taxa de variação (rate) sobre os resultados do downsampling.SELECT device_id,region,time,rate(avg(humidity)) AS rate_humidity FROM sensor WHERE device_id='F07A1260' sample by 2h;A consulta retorna o seguinte resultado:
+-----------+----------+---------------------------+---------------+ | device_id | region | time | rate_humidity | +-----------+----------+---------------------------+---------------+ | F07A1260 | north-cn | 2021-01-01T12:00:00+08:00 | 0.002500 | | F07A1260 | north-cn | 2021-01-01T14:00:00+08:00 | 0.000139 | | F07A1260 | north-cn | 2021-01-01T20:00:00+08:00 | 0.000046 | +-----------+----------+---------------------------+---------------+ -
Exemplo 2: Faça o downsampling dos dados em janelas de 2 horas. Em seguida, calcule o delta (
delta) dos resultados do downsampling.SELECT device_id,region,time,delta(avg(humidity)) AS humidity FROM sensor WHERE device_id='F07A1260' sample by 2h;A consulta retorna o seguinte resultado:
+-----------+----------+---------------------------+-----------+ | device_id | region | time | humidity | +-----------+----------+---------------------------+-----------+ | F07A1260 | north-cn | 2021-01-01T12:00:00+08:00 | 36.000000 | | F07A1260 | north-cn | 2021-01-01T14:00:00+08:00 | 1.000000 | | F07A1260 | north-cn | 2021-01-01T20:00:00+08:00 | 1.000000 | +-----------+----------+---------------------------+-----------+
Interpolação
O downsampling primeiro divide cada série temporal nas janelas de tempo especificadas e aplica uma função de agregação aos pontos de dados dentro de cada janela. Se uma janela de tempo não contiver pontos de dados, a consulta não retornará nenhum resultado para esse intervalo. Use a interpolação para preencher essas lacunas com um valor gerado. Por exemplo, uma consulta de downsampling gera resultados nos carimbos de data/hora t+0, t+20 e t+30. Se a janela de tempo for de 10 unidades, existirá uma lacuna em t+10. Especifique uma política de preenchimento para a interpolação e a consulta poderá gerar um valor em t+10.
A tabela a seguir descreve as políticas de preenchimento disponíveis para interpolação.
|
Política de preenchimento |
Valor interpolado |
|
none |
Não preenche janelas de tempo vazias (padrão). |
|
zero |
Preenche janelas de tempo vazias com 0. |
|
linear |
Executa interpolação linear para preencher janelas de tempo vazias. |
|
previous |
Preenche janelas de tempo vazias com o valor da janela de tempo anterior. |
|
near |
Preenche janelas de tempo vazias com o valor da janela de tempo mais próxima. |
|
after |
Preenche janelas de tempo vazias com o valor da janela de tempo seguinte. |
|
fixed |
Preenche janelas de tempo vazias com um valor fixo especificado. |