MySQL中按col_2分组聚合col_1的连续值范围并生成指定结果
解决MySQL连续数值分组并生成范围的问题
这是个典型的连续数值分组场景,咱们可以借助MySQL的窗口函数来高效实现需求。先理清楚思路,再看具体代码:
示例数据(筛选col_2=3后)
| col_1 | col_2 |
|---|---|
| 1 | 3 |
| 3 | 3 |
| 4 | 3 |
| 7 | 3 |
| 8 | 3 |
| 9 | 3 |
预期结果
| start | end | col_2 |
|---|---|---|
| 1 | - | 3 |
| 3 | 4 | 3 |
| 7 | 9 | 3 |
实现SQL代码
SELECT MIN(col_1) AS start, CASE WHEN MAX(col_1) = MIN(col_1) THEN '-' ELSE CAST(MAX(col_1) AS CHAR) END AS end, col_2 FROM ( SELECT col_1, col_2, -- 生成连续数值的分组标识:连续数减去递增行号结果一致 col_1 - ROW_NUMBER() OVER (PARTITION BY col_2 ORDER BY col_1) AS grp FROM mytbl WHERE col_2 = 3 ) t GROUP BY col_2, grp ORDER BY start;
代码逻辑拆解
子查询分组标识生成:
- 先筛选
col_2=3的记录,按col_1排序。 - 用
col_1 - ROW_NUMBER()生成分组字段grp:连续的col_1值减去递增的行号,结果会保持相同(比如3、4对应的行号是2、3,3-2=1,4-3=1,属于同一组;1对应的行号是1,1-1=0,单独成组)。
- 先筛选
外层查询生成结果:
- 按
col_2和grp分组,取每组最小col_1作为start。 - 用
CASE判断:如果组内只有单个值(最大=最小),则end显示'-';否则显示最大col_1。 - 最后按
start排序,保证结果顺序符合预期。
- 按
运行这段代码后,就能得到你想要的结果啦。
内容的提问来源于stack exchange,提问作者Zen
相关产品推荐
相关产品推荐

