我有这样的数据:
ID SomeVar
123 0
123 1
123 2
234 1
234 2
234 3
456 3
567 0
567 1
我正在尝试按我的ID分组,以返回没有记录的所有ID带有值0
的ID。也就是说,我的选择如下所示:
ID
234
456
是否有一种简单的方法来执行此操作,而无需创建所有记录都不包含0的子集表,然后将其重新连接到表不匹配的完整数据集?
答案 0 :(得分:3)
我通常尝试避免子查询,但是在这种情况下,您可以使用一个子查询。进行相同的分组依据,并检查id是否在SomeVar的id的子查询中不为0。在这种情况下,distinct会做同样的事情,并且效率更高,所以我首先要做:
SELECT DISTINCT ID
FROM [table_name]
WHERE ID NOT IN (
SELECT ID FROM [table_name] WHERE SomeVar = 0
);
如果您想使用GROUP BY获取其他信息:
SELECT ID, max(SomeVar), count(*), sum(SomeVar)
FROM [table_name]
WHERE ID NOT IN (
SELECT ID FROM [table_name] WHERE SomeVar = 0
)
GROUP BY ID;
答案 1 :(得分:3)
您可以使用聚合和having
:
select id
from t
group by id
having min(somevar) > 0;
这假设somevar
永远不会为负。如果有可能,则可以使用稍微冗长的内容:
select id
from t
group by id
having sum(case when somevar = 0 then 1 else 0 end) = 0;
答案 2 :(得分:2)
具有计数或总和聚合的用例语句,使用having
按计数进行过滤:
select ID
from
(
select ID, count(case when SomeVar=0 then 1 end) cnt
from mytable
group by ID having count(case when SomeVar=0 then 1 end) = 0
) s
;