SQL Server:如何筛选rank列仅包含值's'的ID?
问题:查找仅包含特定rank值的ID
现有表结构与数据
SQL Server中的MyTable表包含ID和rank两列,数据示例如下:
| ID | rank |
|---|---|
| 1 | a |
| 1 | b |
| 1 | s |
| 1 | w |
| 2 | s |
| 2 | s |
| 3 | w |
| .. | .. |
需求
查找所有rank列仅包含值's'、无其他取值的ID,预期结果如下:
| ID | rank |
|---|---|
| 2 | s |
解决方案
方法一:GROUP BY + HAVING
通过分组ID,筛选出该ID下所有rank值均为s的记录:
SELECT ID, 's' AS rank FROM MyTable GROUP BY ID HAVING MIN(rank) = 's' AND MAX(rank) = 's';
如果需要更严谨地排除存在其他rank值的情况,可以用以下写法:
SELECT ID, 's' AS rank FROM MyTable GROUP BY ID HAVING COUNT(CASE WHEN rank <> 's' THEN 1 END) = 0;
方法二:NOT EXISTS
通过子查询排除存在非srank值的ID:
SELECT DISTINCT ID, rank FROM MyTable t1 WHERE rank = 's' AND NOT EXISTS ( SELECT 1 FROM MyTable t2 WHERE t2.ID = t1.ID AND t2.rank <> 's' );
内容的提问来源于stack exchange,提问作者FrancoisDuCoq
相关产品推荐
相关产品推荐

