【mysql】rollup 統計集合

數據彙總

在使用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);

得到的結果如下
在這裏插入圖片描述

搞定

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章