SQL Server SQL子集类型筛选器[已关闭]

sirbozc5  于 2022-12-17  发布在  其他
关注(0)|答案(3)|浏览(127)

已关闭。此问题需要details or clarity。当前不接受答案。
**想要改进此问题?**添加详细信息并通过editing this post阐明问题。

4天前关闭。
Improve this question
我有一个列,可以是三个元素中的任意一个,分别是x,y,z,列不允许只有z。
我可以在集合论中想象这一点,其中S = {x,y,z},并且我需要S的除集合{z}之外的所有子集。
如何编写一个SQL语句,让列是x,y,z的任意子集,除了z本身?
例如:
| 识别号|价值|
| - ------|- ------|
| 1个|x|
| 1个|Y型|
| 1个|z|
| 第二章|x|
| 第二章|z|
| 三个|z|
| 三个|z|
预期输出:
| 识别号|价值|
| - ------|- ------|
| 1个|x|
| 1个|Y型|
| 1个|z|
| 第二章|x|
| 第二章|z|

bf1o4zei

bf1o4zei1#

您可以尝试使用计数窗口功能如下:

Select ID, Value
From
(
  Select ID, Value,
    Count(Case When Value = 'z' Then 1 End) Over (Partition By ID) As z_cnt, 
    Count(*) Over (Partition By ID) As all_cnt
  From table_name
) T
Where z_cnt <> all_cnt

参见demo

e5njpo68

e5njpo682#

可以使用 exists 半连接:

select *
    from t
    where not exists (
        select *
        from t t2
        where t2.Id = t.Id and t.Value = 'Z'
        group by id 
        having Count(distinct value) = 1
    );
jchrr9hc

jchrr9hc3#

您可以根据自己的条件使用EXCEPT

SELECT [ID], [Value] FROM tab
EXCEPT
SELECT [ID], [Value] FROm tab t1 WHERE  [Value] = 'z' AND (SELECT COUNT(*) FROm tab WHERE [ID] = t1.[ID]) = 1

| 识别号|价值|
| - ------|- ------|
| 1个|x|
| 1个|Y型|
| 1个|z|
| 第二章|x|
| 第二章|z|
fiddle
如果数据不是唯一的,则可以使用NOT IN代替
x一个一个一个一个x一个一个二个一个x一个一个三个一个
| 识别号|价值|
| - ------|- ------|
| 1个|x|
| 1个|Y型|
| 1个|z|
| 第二章|x|
| 第二章|z|
| 四个|x|
| 四个|x|
| 四个|x|
| 五个|Y型|
| 五个|Y型|
| 五个|Y型|
fiddle

相关问题