数据汇总
在使用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);
得到的结果如下
搞定