MariaDB中如何对GROUPING SETS/ROLLUP分组结果进行排序?
MariaDB中ROLLUP分组结果的可靠排序方法
我需要对一组数据使用ROLLUP进行分组,当前的查询语句如下:
SELECT initial, data, count(*) FROM test GROUP BY ROLLUP(initial,data);
在PostgreSQL等数据库中,我会用grouping()函数来明确控制汇总结果的排序,确保顺序正确:
SELECT initial, data, count(*) FROM test GROUP BY initial,data WITH ROLLUP ORDER BY grouping(initial),initial,grouping(data),data;
但MariaDB没有grouping()函数,虽然测试中默认结果排序看似正确,但不确定这种排序是否可靠,请问在MariaDB中该如何实现ROLLUP分组结果的可靠排序?
解决方案
在MariaDB中,可以利用ROLLUP汇总行的对应列值为NULL的特性,通过ISNULL()函数模拟分组层级,从而实现稳定可靠的排序:
SELECT initial, data, count(*) FROM test GROUP BY ROLLUP(initial, data) ORDER BY ISNULL(initial), -- 优先排序:initial非NULL的行(非汇总行)在前,汇总行在后 initial, ISNULL(data), -- 其次排序:data非NULL的行在前,data的汇总行在后 data;
原理说明
ISNULL(列)函数会在列值为NULL时返回1,否则返回0;排序时0在前、1在后,正好对应非汇总行在前、汇总行在后的逻辑,和grouping()函数的作用一致。- MariaDB默认的ROLLUP结果顺序依赖于内部处理的物理逻辑,在数据量变化、索引调整或版本更新时可能发生变化,因此必须显式指定
ORDER BY来保证排序的稳定性。
内容的提问来源于stack exchange,提问作者Manngo
相关产品推荐
相关产品推荐

