SQL查询:如何筛选存在Col2=1且后续连续行是2的ID?
正确筛选符合条件ID的SQL解法
要筛选满足以下两个条件的ID:
- 该ID对应的Col2字段存在值1
- 同一ID下,值1所在行的下一行Col2值必须为2
直接用窗口函数LEAD()就能高效解决这个问题,它可以直接获取同一分组内当前行的下一行数据。
核心SQL代码
SELECT DISTINCT t.ID FROM ( SELECT ID, Col2, -- 按ID分组,每组内按排序字段排序,获取下一行的Col2值 LEAD(Col2) OVER (PARTITION BY ID ORDER BY [排序字段]) AS next_Col2 FROM your_table ) t -- 筛选出当前行Col2是1,且下一行Col2是2的记录 WHERE t.Col2 = 1 AND t.next_Col2 = 2;
关键说明
- 必须指定排序字段:数据库表本身是无序的,「下一行」的定义依赖于明确的排序规则(比如自增ID、创建时间、业务顺序号等),请把代码里的
[排序字段]替换成你表中用来确定行顺序的实际列名。 - DISTINCT去重:同一个ID可能存在多组"1后跟2"的情况,用DISTINCT确保每个符合条件的ID只返回一次。
为什么之前的左连接会返回所有ID?
左连接的逻辑是保留左表的所有行,如果你没有在关联条件或WHERE子句中严格过滤掉不满足"1后跟2"的ID,就会导致所有ID都被保留。比如只是简单关联同ID的行,但没限定下一行的顺序和值,就无法正确筛选。
示例验证
假设你的样本表数据如下(带排序字段):
| ID | Col2 | row_num |
|---|---|---|
| 1 | 3 | 1 |
| 1 | 1 | 2 |
| 1 | 2 | 3 |
| 2 | 1 | 1 |
| 2 | 3 | 2 |
| 3 | 2 | 1 |
| 3 | 1 | 2 |
| 3 | 2 | 3 |
运行上述SQL后,会得到结果:1和3,符合期望输出;ID=2因为1后面是3,会被排除。
内容的提问来源于stack exchange,提问作者Nithya
相关产品推荐
相关产品推荐

