SQL如何分组连续相同值行直到出现异值且保留原有顺序
连续相同行合并SQL实现方案
原SQL存在的问题
你当前的写法是对ref_id、sku、ordered做全局分组,会把所有这三个字段值相同的行全部合并,不管它们在原始表中是否被其他不同行隔开,所以会把示例中ref_id=16、sku=39562、ordered=0的前后两段连续行合并为1条,和预期结果不符。
实现思路
这类连续相同数据分组的问题属于SQL经典的间隙与孤岛(Gaps and Islands) 场景,核心是给连续的相同行打上同一个组标识,再按组去重即可,实现前提是你的表中存在可以确定原始行顺序的字段(比如自增主键id、时间字段timeInfo)。
具体步骤:
- 给所有行按原始顺序生成全局行号
- 按需要判断相同的三个字段
ref_id、sku、ordered分区,生成分区内的行号 - 全局行号减去分区行号得到组标识,连续相同行的组标识完全一致
- 按组标识分组后取每个组的单条数据即可
参考SQL代码(支持窗口函数的数据库,如MySQL8.0+、PostgreSQL、SQL Server等)
WITH group_mark AS ( SELECT ref_id, sku, ordered, -- 此处ORDER BY后的字段替换为你表中实际用来确定原始顺序的字段,比如id或者timeInfo ROW_NUMBER() OVER (ORDER BY id) AS global_rn, ROW_NUMBER() OVER (PARTITION BY ref_id, sku, ordered ORDER BY id) AS part_rn FROM 你的表名 ) SELECT ref_id, sku, ordered FROM group_mark -- 连续相同行的global_rn - part_rn值完全相同,作为分组依据 GROUP BY (global_rn - part_rn), ref_id, sku, ordered -- 保留原始顺序 ORDER BY MIN(global_rn);
执行以上SQL即可得到你预期的输出结果。
内容的提问来源于stack exchange,提问作者Adib
相关产品推荐
相关产品推荐

