本文共 1209 字,大约阅读时间需要 4 分钟。
在使用TimescaleDB数据库并做数据聚合时
SELECT labels, count(*) as sample_count, avg(elapsed) as elapsed_avg, percentile_cont(0.5) WITHIN GROUP (ORDER BY elapsed) as elapsed_50pcFROM report_sampleWHERE task_id = '63e26fe1821d45f5a1901825b1cf5dd0'group by labels;
得到的结果是
需要将每一列的数据做一个汇总计算,可以load到数据后在代码中进行计算,但是以上数据有个问题,即elapsed_50pc 数据获取的是中位数,在代码中无法根据获取的group by数据计算得处汇总的数据中位数
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_50pcFROM report_sampleWHERE task_id = '63e26fe1821d45f5a1901825b1cf5dd0'group by ROLLUP(labels);
可以得出以下结果
很明显最后一行计算出了汇总到数据ps:ROLLUP支持不同层级的汇总集合
但是发现最后一行的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_50pcFROM report_sampleWHERE task_id = '63e26fe1821d45f5a1901825b1cf5dd0'group by ROLLUP(labels);
得到的结果如下
搞定
转载地址:http://mptvf.baihongyu.com/