在 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
;
我有这样的数据:
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
;