聚合查詢是時序數(shù)據(jù)分析的核心能力,通過聚合函數(shù)和分組操作,可以從海量時序數(shù)據(jù)中提取有價值的統(tǒng)計(jì)信息。本文將詳細(xì)介紹TDengine時序數(shù)據(jù)庫的聚合查詢功能。
一、聚合查詢基礎(chǔ)
1.1 什么是聚合查詢
聚合查詢是指對一組數(shù)據(jù)進(jìn)行匯總計(jì)算,返回單一結(jié)果的查詢方式。在時序數(shù)據(jù)庫場景中,聚合查詢常用于:
- 計(jì)算平均值、最大值、最小值
- 統(tǒng)計(jì)數(shù)據(jù)量
- 按維度分組匯總
- 計(jì)算數(shù)據(jù)分布特征
1.2 GROUP BY子句規(guī)則
TDengine支持通過GROUP BY子句對數(shù)據(jù)進(jìn)行聚合查詢。SQL語句包含GROUP BY子句時,SELECT列表只能包含如下表達(dá)式:
- 常量
- 聚合函數(shù)
- 與GROUP BY后表達(dá)式相同的表達(dá)式
- 包含前面表達(dá)式的表達(dá)式
1.3 基本聚合查詢示例
SELECT groupid, avg(voltage)
FROM meters
WHERE ts >= "2022-01-01T00:00:00+08:00"
AND ts < "2023-01-01T00:00:00+08:00"
GROUP BY groupid;
上面的SQL查詢超級表meters中指定時間范圍的數(shù)據(jù),按照groupid進(jìn)行分組,求每組的平均電壓。
查詢結(jié)果:
groupid | avg(voltage) |
======================================
8 | 243.961981544901079 |
5 | 243.961981544901079 |
1 | 243.961981544901079 |
7 | 243.961981544901079 |
9 | 243.961981544901079 |
6 | 243.961981544901079 |
4 | 243.961981544901079 |
10 | 243.961981544901079 |
2 | 243.961981544901079 |
3 | 243.961981544901079 |
Query OK, 10 row(s) in set (0.042446s)
注意:GROUP BY子句在聚合數(shù)據(jù)時,并不保證結(jié)果集按照特定順序排列。為了獲得有序的結(jié)果集,可以使用ORDER BY子句對結(jié)果進(jìn)行排序。
二、內(nèi)置聚合函數(shù)詳解
TDengine提供了多種內(nèi)置的聚合函數(shù),滿足不同的分析需求。
2.1 基礎(chǔ)統(tǒng)計(jì)函數(shù)
| 函數(shù) | 功能說明 | 示例 |
|---|---|---|
| AVG | 統(tǒng)計(jì)指定字段的平均值 | AVG(voltage) |
| COUNT | 統(tǒng)計(jì)指定字段的記錄行數(shù) | COUNT(*) |
| SUM | 統(tǒng)計(jì)表中某列的和 | SUM(current) |
| MAX | 統(tǒng)計(jì)表中某列的最大值 | MAX(voltage) |
| MIN | 統(tǒng)計(jì)表中某列的最小值 | MIN(voltage) |
2.2 高級統(tǒng)計(jì)函數(shù)
| 函數(shù) | 功能說明 |
|---|---|
| STDDEV | 統(tǒng)計(jì)表中某列的均方差 |
| SPREAD | 統(tǒng)計(jì)表中某列的最大值和最小值之差 |
| PERCENTILE | 統(tǒng)計(jì)表中某列的值百分比分位數(shù) |
| APERCENTILE | 統(tǒng)計(jì)表/超級表中指定列的值的近似百分比分位數(shù) |
2.3 時序特色函數(shù)
| 函數(shù) | 功能說明 |
|---|---|
| ELAPSED | 表達(dá)統(tǒng)計(jì)周期內(nèi)連續(xù)的時間長度,和TWA函數(shù)配合使用可以計(jì)算統(tǒng)計(jì)曲線下的面積 |
| LEASTSQUARES | 統(tǒng)計(jì)表中某列的值的擬合直線方程 |
| HYPERLOGLOG | 采用hyperloglog算法,返回某列的基數(shù) |
| HISTOGRAM | 統(tǒng)計(jì)數(shù)據(jù)按照用戶指定區(qū)間的分布 |
三、常用聚合函數(shù)應(yīng)用
3.1 AVG – 平均值計(jì)算
-- 計(jì)算所有設(shè)備的平均電壓
SELECT AVG(voltage) FROM meters;
-- 按分組計(jì)算平均電壓
SELECT groupid, AVG(voltage) FROM meters GROUP BY groupid;
-- 按地區(qū)計(jì)算平均電流
SELECT location, AVG(current) FROM meters GROUP BY location;
3.2 COUNT – 計(jì)數(shù)統(tǒng)計(jì)
-- 統(tǒng)計(jì)總記錄數(shù)
SELECT COUNT(*) FROM meters;
-- 統(tǒng)計(jì)非空值數(shù)量
SELECT COUNT(voltage) FROM meters;
-- 按設(shè)備統(tǒng)計(jì)記錄數(shù)
SELECT tbname, COUNT(*) FROM meters GROUP BY tbname;
3.3 SUM – 求和計(jì)算
-- 計(jì)算電流總和
SELECT SUM(current) FROM meters;
-- 按分組計(jì)算電流總和
SELECT groupid, SUM(current) FROM meters GROUP BY groupid;
3.4 SPREAD – 極差計(jì)算
SPREAD函數(shù)計(jì)算最大值與最小值的差值,常用于分析數(shù)據(jù)波動范圍:
-- 計(jì)算電壓波動范圍
SELECT SPREAD(voltage) FROM meters;
-- 按設(shè)備計(jì)算電壓波動范圍
SELECT tbname, SPREAD(voltage) FROM meters GROUP BY tbname;
3.5 STDDEV – 標(biāo)準(zhǔn)差計(jì)算
標(biāo)準(zhǔn)差反映數(shù)據(jù)的離散程度:
-- 計(jì)算電壓標(biāo)準(zhǔn)差
SELECT STDDEV(voltage) FROM meters;
-- 按分組計(jì)算電壓標(biāo)準(zhǔn)差
SELECT groupid, STDDEV(voltage) FROM meters GROUP BY groupid;
四、百分位數(shù)函數(shù)
4.1 PERCENTILE
精確計(jì)算百分位數(shù):
-- 計(jì)算電壓的中位數(shù)(50%分位數(shù))
SELECT PERCENTILE(voltage, 50) FROM meters;
-- 計(jì)算電壓的95%分位數(shù)
SELECT PERCENTILE(voltage, 95) FROM meters;
4.2 APERCENTILE
近似計(jì)算百分位數(shù),適用于大數(shù)據(jù)量場景:
-- 近似計(jì)算電壓的中位數(shù)
SELECT APERCENTILE(voltage, 50) FROM meters;
APERCENTILE與PERCENTILE相似,但返回近似結(jié)果,在大數(shù)據(jù)量情況下性能更好。
五、LEASTSQUARES – 線性擬合
LEASTSQUARES函數(shù)用于計(jì)算數(shù)據(jù)的線性擬合方程:
-- 計(jì)算電流隨時間變化的線性擬合
SELECT LEASTSQUARES(current, 1, 1) FROM d1001;
參數(shù)說明:
- 第一個參數(shù):要擬合的列
- 第二個參數(shù):自變量初始值
- 第三個參數(shù):自變量的步長值
六、HYPERLOGLOG – 基數(shù)估計(jì)
HYPERLOGLOG采用hyperloglog算法返回某列的基數(shù)(不同值的個數(shù)):
-- 估計(jì)不同電壓值的數(shù)量
SELECT HYPERLOGLOG(voltage) FROM meters;
該算法在數(shù)據(jù)量很大的情況下,可以明顯降低內(nèi)存的占用。求出來的基數(shù)是個估算值,標(biāo)準(zhǔn)誤差為0.81%。
七、HISTOGRAM – 數(shù)據(jù)分布統(tǒng)計(jì)
HISTOGRAM函數(shù)統(tǒng)計(jì)數(shù)據(jù)按照用戶指定區(qū)間的分布:
-- 統(tǒng)計(jì)電壓在不同區(qū)間的分布
SELECT HISTOGRAM(voltage, 200, 250, 10) FROM meters;
八、聚合查詢最佳實(shí)踐
8.1 結(jié)合時間范圍
聚合查詢應(yīng)結(jié)合時間范圍條件,提高查詢效率:
SELECT groupid, AVG(voltage), MAX(voltage), MIN(voltage)
FROM meters
WHERE ts >= '2022-01-01 00:00:00' AND ts < '2022-02-01 00:00:00'
GROUP BY groupid;
8.2 多聚合函數(shù)組合
可以在一個查詢中使用多個聚合函數(shù):
SELECT groupid,
COUNT(*) as count,
AVG(voltage) as avg_voltage,
MAX(voltage) as max_voltage,
MIN(voltage) as min_voltage,
STDDEV(voltage) as std_voltage
FROM meters
WHERE ts >= '2022-01-01 00:00:00'
GROUP BY groupid;
8.3 使用HAVING過濾分組
HAVING子句用于過濾分組后的結(jié)果:
SELECT groupid, AVG(voltage) as avg_v
FROM meters
GROUP BY groupid
HAVING avg_v > 240;
8.4 結(jié)果排序
使用ORDER BY對聚合結(jié)果排序:
SELECT groupid, AVG(voltage) as avg_v
FROM meters
GROUP BY groupid
ORDER BY avg_v DESC;
九、直接在超級表上聚合
用戶可以直接在超級表上執(zhí)行聚合查詢,無須預(yù)先創(chuàng)建子表:
SELECT location, AVG(voltage), COUNT(*)
FROM meters
WHERE ts >= '2022-01-01 00:00:00'
GROUP BY location;
TDengine會自動處理所有子表的數(shù)據(jù)聚合,大大簡化了查詢邏輯。
總結(jié)
聚合查詢是時序數(shù)據(jù)分析的核心能力,TDengine時序數(shù)據(jù)庫提供了豐富的聚合函數(shù)和靈活的分組機(jī)制。從基礎(chǔ)的COUNT、AVG、SUM到高級的PERCENTILE、LEASTSQUARES,這些函數(shù)覆蓋了時序數(shù)據(jù)分析的主要場景。通過合理使用聚合查詢,開發(fā)者可以從海量時序數(shù)據(jù)中快速提取有價值的信息,為工業(yè)數(shù)據(jù)管理平臺(IDMP)和實(shí)時數(shù)據(jù)庫應(yīng)用提供強(qiáng)大的數(shù)據(jù)支撐。TDengine憑借其高效的聚合查詢能力,成為物聯(lián)網(wǎng)和工業(yè)場景數(shù)據(jù)分析的理想選擇。



互聯(lián)網(wǎng).png)



-1.png)







證.png)


伙伴.png)
伙伴.png)
伙伴.png)



