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

问题描述 投票:1回答:3

我有这样的数据:

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的记录的子集表的情况下执行此操作,然后将其连接回表格不匹配的完整数据集?

sql hive impala
3个回答
3
投票

我通常会尝试避免子查询,但您可以在这种情况下使用子查询。执行相同的组,并检查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;

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
投票

具有计数或总和聚合的用例语句,使用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
;
© www.soinside.com 2019 - 2024. All rights reserved.