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

得到的结果如下
在这里插入图片描述

搞定

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