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

时间:2019-02-27 19:34:46

标签: sql hive impala

我有这样的数据:

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

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

ID
234
456

是否有一种简单的方法来执行此操作,而无需创建所有记录都不包含0的子集表,然后将其重新连接到表不匹配的完整数据集?

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分: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 :(得分: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
;