我有这样的数据:
ID SomeVar
123 0
123 1
123 2
234 1
234 2
234 3
456 3
567 0
567 1
我正在尝试按照我的ID进行分组,以返回所有没有值为0
的记录的ID。也就是说,我的选择看起来像这样:
ID
234
456
是否有一种简单的方法可以在不创建包含所有不包含0的记录的子集表的情况下执行此操作,然后将其连接回表格不匹配的完整数据集?
我通常会尝试避免子查询,但您可以在这种情况下使用子查询。执行相同的组,并检查id是否不在SomeVar为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;
您可以使用聚合和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;
具有计数或总和聚合的用例语句,使用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
;