數據彙總
在使用TimescaleDB數據庫並做數據聚合時
SELECT
labels,
count(*) as sample_count,
avg(elapsed) as elapsed_avg,
percentile_cont(0.5) WITHIN GROUP (ORDER BY elapsed) as elapsed_50pc
FROM
report_sample
WHERE
task_id = '63e26fe1821d45f5a1901825b1cf5dd0'
group by labels;
得到的結果是
需要將每一列的數據做一個彙總計算,可以load到數據後在代碼中進行計算,但是以上數據有個問題,即elapsed_50pc 數據獲取的是中位數,在代碼中無法根據獲取的group by數據計算得處彙總的數據中位數
ROLLUP
PostgreSQL ROLLUP 是group by 的子句,是生成多個分組集合的快捷功能
ROLLUP假設輸入列之間存在層次結構,從而生成有意義的所有分組集合
這就是爲什麼ROLLUP經常用於生成報表的小計和總計
修改執行的sql語句
SELECT
labels,
count(*) as sample_count,
avg(elapsed) as elapsed_avg,
percentile_cont(0.5) WITHIN GROUP (ORDER BY elapsed) as elapsed_50pc
FROM
report_sample
WHERE
task_id = '63e26fe1821d45f5a1901825b1cf5dd0'
group by ROLLUP(labels);
可以得出以下結果
很明顯最後一行計算出了彙總到數據
ps:ROLLUP支持不同層級的彙總集合
CASE
但是發現最後一行的labels 爲null,需要增加默認的字段信息
SELECT
CASE WHEN labels is not null THEN labels ELSE 'TOTLE' END AS labels,
count(*) as sample_count,
avg(elapsed) as elapsed_avg,
percentile_cont(0.5) WITHIN GROUP (ORDER BY elapsed) as elapsed_50pc
FROM
report_sample
WHERE
task_id = '63e26fe1821d45f5a1901825b1cf5dd0'
group by ROLLUP(labels);
得到的結果如下
搞定