Tüm Ürünler
Search
Belge Merkezi

Lindorm:Aşağı örnekleme sorguları

Son Güncelleme:Oct 07, 2026

Aşağı örnekleme sorgusu, zaman bazlı bir toplama sorgusudur. Zaman serisi uygulamalarında verilerin örneklem oranını düşürmek için yaygın olarak kullanılır.

Motorlar ve sürümler

Aşağı örnekleme sorguları yalnızca LindormTSDB 3.4.15 ve sonraki sürümlerde desteklenir.

Not

Lindorm örneğinizin LindormTSDB sürümünü görüntüleme ve yükseltme hakkında daha fazla bilgi için bkz. LindormTSDB sürüm notları ve Bir Lindorm örneğinin küçük motor sürümünü yükseltme.

Söz dizimi

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

Desteklenen toplama işlevleri

SAMPLE BY yan tümcesi, her bir zaman serisi üzerinde aşağı örnekleme işlemi gerçekleştirir. Zaman serileri hakkında daha fazla bilgi için bkz. veri modeli.

SAMPLE BY yan tümcesi aşağıdaki toplama işlevlerini destekler:


İşlev


Açıklama


SUM


Belirtilen her zaman penceresindeki değerlerin toplamını hesaplar.


AVG


Belirtilen her zaman penceresindeki değerlerin ortalamasını hesaplar.


COUNT


Belirtilen her zaman penceresindeki değer sayısını hesaplar.


MIN


Belirtilen her zaman penceresindeki en düşük değeri bulur.


MAX


Belirtilen her zaman penceresindeki en yüksek değeri bulur.


FIRST


Belirtilen her zaman penceresindeki ilk değeri döndürür.


LAST


Belirtilen her zaman penceresindeki son değeri döndürür.


PERCENTILE


Belirtilen her zaman penceresindeki değerlerin yüzdelik dilimini hesaplar.


LATEST


Tüm zaman aralığındaki en güncel değeri döndürür.


RATE


Geçerli değer ile önceki satırdaki değer arasındaki değişim oranını hesaplar.


DELTA


Geçerli değer ile önceki satırdaki değer arasındaki farkı hesaplar.

Aşağı örnekleme sorguları yalnızca etiket sütunlarına göre filtrelemeyi destekler; alan sütunlarına göre filtrelemeyi desteklemez. Bir alan sütununa uygulanan filtreler yoksayılır ve beklenmeyen sonuçlara neden olabilir. Bir alan sütununda filtreleme yapmak için, aşağı örnekleme sorgusunun sonuçlarına filtreyi uygulamak üzere bir alt sorgu kullanın.

Örnek olarak latest(field, n) işlevini ele alalım; burada temperature bir alan sütunudur:

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;

Örnekler

Bir SELECT sorgusunda, her alan sütunu için bir toplama işlevi belirtmeniz gerekir ancak etiket sütunları için bu gerekli değildir.

Aşağıdaki örneklerde, şeması ve verileri aşağıda gösterilen sensor adlı bir örnek tablo kullanılmıştır:

-- 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);

Aşağı örnekleme ve alt sorgu örnekleri

Not

Bir alt sorguyu aşağı örnekleme sorgusu içinde iç içe yerleştiremezsiniz ancak aşağı örnekleme sorgusunu bir alt sorgu olarak kullanabilirsiniz.

  • Örnek 1: Varsayılan UTC hizalı aşağı örnekleme gerçekleştirin. Bu sorgu, her zaman serisini 8 saatlik zaman pencerelerinde toplar ve her pencere için sayıyı hesaplar.

    SELECT device_id,region,time,count(humidity) AS count_humidity FROM sensor WHERE device_id='F07A1260' sample by 8h;

    Sonuç aşağıdaki gibi döndürülür:

    +-----------+----------+---------------------------+----------------+
    | 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              |
    +-----------+----------+---------------------------+----------------+
  • Örnek 2: Ofset içeren UTC hizalı aşağı örnekleme gerçekleştirin. Bu sorgu, her zaman serisini 8 saatlik zaman pencerelerinde toplar, her pencerenin başlangıcını 3 saat kaydırır ve sayıyı hesaplar.

    SELECT device_id,region,time,count(humidity) AS count_humidity FROM sensor WHERE device_id='F07A1260' sample by 8h offset 3h;

    Sonuç aşağıdaki gibi döndürülür:

    +-----------+----------+---------------------------+----------------+
    | 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              |
    +-----------+----------+---------------------------+----------------+
  • Örnek 3: Yerel saat diliminin gece yarısına hizalanacak şekilde UTC hizalı aşağı örnekleme gerçekleştirin. Bu sorgu, her zaman serisini 24 saatlik zaman pencerelerinde toplar ve UTC+08:00 saat diliminde 00:00'a hizalamak için başlangıcı 16 saat kaydırır. Ardından sayıyı hesaplar.

    SELECT device_id,region,time,count(humidity) AS count_humidity FROM sensor WHERE device_id='F07A1260' sample by 24h offset 16h

    Sonuç aşağıdaki gibi döndürülür:

    +-----------+----------+---------------------------+----------------+
    | device_id | region   | time                      | count_humidity |
    +-----------+----------+---------------------------+----------------+
    | F07A1260  | north-cn | 2021-01-01T00:00:00+08:00 | 4              |
    +-----------+----------+---------------------------+----------------+
  • Örnek 4: SAMPLE BY yan tümcesi doğrudan GROUP BY, LIMIT OFFSET veya ORDER BY ile birlikte kullanılamaz. Bu yan tümceleri kullanmak için SAMPLE BY sorgusunu bir alt sorgu içine alın.

    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;

    Sonuç aşağıdaki gibi döndürülür:

    +-----------+--------------+
    | device_id | max_humidity |
    +-----------+--------------+
    | F07A1261  | 43.000000    |
    | F07A1260  | 47.000000    |
    +-----------+--------------+
  • Örnek 5: Dış sorguda LIMIT OFFSET kullanarak aşağı örnekleme alt sorgusundan gelen sonuç sayısını sınırlayın.

    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;

    Sonuç aşağıdaki gibi döndürülür:

    +-----------+----------+--------------+
    | device_id |  region  | avg_humidity |
    +-----------+----------+--------------+
    | F07A1261  | north-cn | 40.000000    |
    +-----------+----------+--------------+

Ara değer doldurma ile aşağı örnekleme örnekleri

  • Örnek 1: Sabit bir değerle veri ara değerlerini doldurun.

    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;

    Sonuç aşağıdaki gibi döndürülür:

    +-----------+----------+---------------------------+-----------+
    | 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 |
    +-----------+----------+---------------------------+-----------+
  • Örnek 2: Sonraki zaman penceresinden alınan değerle veri ara değerlerini doldurun.

    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;

    Sonuç aşağıdaki gibi döndürülür:

    +-----------+----------+---------------------------+-----------+
    | 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 |
    +-----------+----------+---------------------------+-----------+

Aşağı örnekleme sonrası dönüşüm örnekleri

  • Örnek 1: AVG() işlevini kullanarak verileri 2 saatlik pencerelerde aşağı örnekleyin. Ardından aşağı örneklenmiş sonuçlar üzerinde rate (değişim oranı) hesaplayın.

    SELECT device_id,region,time,rate(avg(humidity)) AS rate_humidity FROM sensor WHERE device_id='F07A1260' sample by 2h;

    Sonuç aşağıdaki gibi döndürülür:

    +-----------+----------+---------------------------+---------------+
    | 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      |
    +-----------+----------+---------------------------+---------------+
  • Örnek 2: Verileri 2 saatlik pencerelerde aşağı örnekleyin. Ardından aşağı örneklenmiş sonuçların delta (fark) değerini hesaplayın.

    SELECT device_id,region,time,delta(avg(humidity)) AS humidity FROM sensor WHERE device_id='F07A1260' sample by 2h;

    Sonuç aşağıdaki gibi döndürülür:

    +-----------+----------+---------------------------+-----------+
    | 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  |
    +-----------+----------+---------------------------+-----------+

Ara değer doldurma

Aşağı örnekleme sırasında her zaman serisi belirtilen zaman pencerelerine bölünür ve her penceredeki veri noktalarına bir toplama işlevi uygulanır. Bir zaman penceresinde veri noktası yoksa sorgu o aralık için sonuç döndürmez. Bu boşlukları oluşturulan bir değerle doldurmak için ara değer doldurma kullanın. Örneğin, bir aşağı örnekleme sorgusu t+0, t+20 ve t+30 zaman damgalarında sonuç üretir. Zaman penceresi 10 birim ise t+10 noktasında bir boşluk bulunur. Ara değer doldurma için bir doldurma ilkesi belirtirseniz sorgu t+10 noktasında bir değer üretebilir.

Aşağıdaki tabloda ara değer doldurma için kullanılabilir doldurma ilkeleri açıklanmıştır.


Doldurma ilkesi


Ara değer


yok


Boş zaman pencerelerini doldurmaz (varsayılan).


sıfır


Boş zaman pencerelerini 0 ile doldurur.


doğrusal


Boş zaman pencerelerini doldurmak için doğrusal ara değer doldurma uygular.


önceki


Boş zaman pencerelerini önceki zaman penceresinden alınan değerle doldurur.


en yakın


Boş zaman pencerelerini en yakın zaman penceresinden alınan değerle doldurur.


sonraki


Boş zaman pencerelerini sonraki zaman penceresinden alınan değerle doldurur.


sabit


Boş zaman pencerelerini belirtilen sabit bir değerle doldurur.