如何在SQL中按特定顺序将行分组为连续集合并提取每组指定列最小值
实现方案
这是SQL中典型的**连续值分组(岛屿问题)**场景,核心思路是通过窗口函数差值给连续相同的two值打相同的分组标记,再分组取最小值即可,以下方案兼容所有支持标准SQL窗口函数的数据库(MySQL 8.0+、PostgreSQL、SQL Server、Oracle等)。
完整SQL代码
WITH t AS ( SELECT *, -- 全局行号,按three升序排序保证顺序正确 ROW_NUMBER() OVER (PARTITION BY one ORDER BY three) rn1, -- 按one、two分区后的行号 ROW_NUMBER() OVER (PARTITION BY one, two ORDER BY three) rn2 FROM 你的表名 ) SELECT one, two, MIN(three) AS three FROM t -- rn1-rn2值相同的行,就是two值连续的同组数据 GROUP BY one, two, rn1 - rn2 ORDER BY three;
逻辑说明
- 连续相同的
two值行,全局行号和分区行号的增长速度完全一致,所以二者差值固定,用这个差值作为分组ID即可区分不同的连续组 - 如果你的表中
one列只有固定值,可以去掉PARTITION BY one的逻辑,不影响结果 - 执行后输出结果和你给出的预期完全一致
内容的提问来源于stack exchange,提问作者Ishaan Gupta
相关产品推荐
相关产品推荐

