【mysql】rollup 统计集合

    技术2022-07-11  92

    数据汇总

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

    得到的结果如下

    搞定

    Processed: 0.014, SQL: 9