在 SQL 中的多行中选择具有或不具有特定条件的组

Selecting a group with or without certain conditions across many rows in SQL

我有这样的数据:

ID     SomeVar
123      0
123      1
123      2
234      1
234      2
234      3
456      3
567      0
567      1

我正在尝试按我的 ID 分组 return 所有没有记录值为 0 的 ID。也就是说,我的选择如下所示:

ID
234
456

有没有一种简单的方法可以做到这一点,而无需创建所有记录都不包含 0 的子集 table,然后将其连接回 table 不匹配的完整数据集?

我通常尽量避免子查询,但您可以在这种情况下使用子查询。执行相同的分组依据,并检查该 id 是否不在对 SomeVar 为 0 的 id 的子查询中。在这种情况下,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
;