AS9*_*S91 5 sql sql-server select group-by sql-server-2012
药片
CID Code
1 A
1 B
1 C
2 C
2 A
2 B
3 A
3 D
Run Code Online (Sandbox Code Playgroud)
我希望输出只有那些 CID 组 Code <> 'C'
期望输出:
CID Code
3 A
3 D
Run Code Online (Sandbox Code Playgroud)
查询尝试:
SELECT DISTINCT
CID
,Code
FROM Table T
WHERE Code <> 'C'
Run Code Online (Sandbox Code Playgroud)
但这将排除代码 = C 的行,而不是代码 = C 的整个组。不知道如何GROUP BY在这里工作
一种方法使用not exists:
select distinct cid, code
from t
where not exists (select 1
from t t2
where t2.cid = t.cid and t2.code = 'C'
);
Run Code Online (Sandbox Code Playgroud)
另一种方法使用窗口函数:
select distinct cid, code
from (select t.*,
sum(case when t.code = 'C' then 1 else 0 end) over (partition by cid) as numCs
from t
) t
where numCs = 0;
Run Code Online (Sandbox Code Playgroud)
另一种变体,它产生与带有以下内容的执行计划相同的执行计划NOT EXISTS:
SELECT T.CID, T.Code
FROM T
WHERE
T.CID NOT IN
(
SELECT T2.CID
FROM T AS T2
WHERE T2.Code = 'C'
)
;
Run Code Online (Sandbox Code Playgroud)
内部查询给出了至少有一个 的所有 CID 组的列表C。主查询返回所有其他组中不包含在内部列表中的所有行。
我不明白你为什么要提出DISTINCT这个问题。如果数据没有重复项,DISTINCT则会进行额外的排序,但没有任何用处,因为已经没有重复项了。如果数据有重复项 - 您真的想删除它们吗?
| 归档时间: |
|
| 查看次数: |
1686 次 |
| 最近记录: |