Todos os produtos
Search
Central de documentação

Lindorm:Consultas de downsampling

Última atualização: Sep 22, 2026

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.

Nota

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

SUM

Calcula a soma dos valores dentro de cada janela de tempo especificada.

AVG

Calcula a média dos valores dentro de cada janela de tempo especificada.

COUNT

Conta o número de valores dentro de cada janela de tempo especificada.

MIN

Encontra o valor mínimo dentro de cada janela de tempo especificada.

MAX

Encontra o valor máximo dentro de cada janela de tempo especificada.

FIRST

Retorna o primeiro valor dentro de cada janela de tempo especificada.

LAST

Retorna o último valor dentro de cada janela de tempo especificada.

PERCENTILE

Calcula o percentil dos valores dentro de cada janela de tempo especificada.

LATEST

Retorna o valor mais recente em todo o intervalo de tempo.

RATE

Calcula a taxa de variação entre o valor atual e o valor na linha anterior.

DELTA

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

Nota

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 16h

    A 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 BY não pode ser usada diretamente com GROUP BY, LIMIT OFFSET ou ORDER BY. Para usar essas cláusulas, envolva a consulta SAMPLE BY em 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 OFFSET em 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.