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.
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:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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
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 16hSonuç 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 BYyan tümcesi doğrudanGROUP BY,LIMIT OFFSETveyaORDER BYile birlikte kullanılamaz. Bu yan tümceleri kullanmak içinSAMPLE BYsorgusunu 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 OFFSETkullanarak 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 üzerinderate(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.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|