如何筛选Item顺序异常的RunNumber(Close的Id小于Open的Id)
解决方法
先整理你的Items表结构及数据:
| Id | Name | RunNumber |
|---|---|---|
| 1 | Open | 1 |
| 2 | Close | 1 |
| 1 | Open | 2 |
| 2 | Close | 2 |
| 1 | Close | 3 |
| 2 | Open | 3 |
| 1 | Open | 4 |
| 2 | Close | 4 |
以下是两种获取顺序异常RunNumber的SQL实现方法:
方法一:自连接查询
通过表自连接匹配同一RunNumber下的Close和Open记录,直接筛选符合条件的RunNumber:
SELECT DISTINCT a.RunNumber FROM Items a INNER JOIN Items b ON a.RunNumber = b.RunNumber WHERE a.Name = 'Close' AND b.Name = 'Open' AND a.Id < b.Id;
执行后会返回RunNumber = 3,即顺序异常的记录。
方法二:分组聚合查询
先按RunNumber分组提取每组的Open/Close任务Id,再筛选符合条件的分组:
SELECT RunNumber FROM ( SELECT RunNumber, MAX(CASE WHEN Name = 'Open' THEN Id END) AS OpenId, MAX(CASE WHEN Name = 'Close' THEN Id END) AS CloseId FROM Items GROUP BY RunNumber ) AS grouped_data WHERE CloseId < OpenId;
子查询完成分组聚合后,主查询判断CloseId是否小于OpenId,同样能得到目标结果。
内容的提问来源于stack exchange,提问作者Jonny Hotchkiss
相关产品推荐
相关产品推荐

