我有这样的数据:
ID SomeVar 123 0 123 1 123 2 234 1 234 2 234 3 456 3 567 0 567 1
我正在尝试按我的id分组,以返回所有没有该值记录的id 0 . 也就是说,我的选择如下所示:
0
ID 234 456
有没有一种简单的方法可以做到这一点,而不必创建一个所有记录都不包含0的子集表,然后将其连接回表不匹配的完整数据集?
j7dteeu81#
您可以使用聚合和 having :
having
select id from t group by id having min(somevar) > 0;
这是假设 somevar 从不消极。如果这是可能的,那么您可以使用稍微详细一点的:
somevar
select id from t group by id having sum(case when somevar = 0 then 1 else 0 end) = 0;
hts6caw32#
带有count或sum聚合的用例语句,使用 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 ;
j8ag8udp3#
我通常尝试避免子查询,但在这种情况下可以使用一个。执行相同的groupby,并检查id是否不在somevar为0的id的子查询中。在这种情况下,distinct将执行相同的操作,并且效率更高,因此我将首先执行以下操作:
SELECT DISTINCT ID FROM [table_name] WHERE ID NOT IN ( SELECT ID FROM [table_name] WHERE SomeVar = 0 );
如果你想通过分组方式获得其他信息:
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;
3条答案
按热度按时间j7dteeu81#
您可以使用聚合和
having
:这是假设
somevar
从不消极。如果这是可能的,那么您可以使用稍微详细一点的:hts6caw32#
带有count或sum聚合的用例语句,使用
having
:j8ag8udp3#
我通常尝试避免子查询,但在这种情况下可以使用一个。执行相同的groupby,并检查id是否不在somevar为0的id的子查询中。在这种情况下,distinct将执行相同的操作,并且效率更高,因此我将首先执行以下操作:
如果你想通过分组方式获得其他信息: