配置单元—跨sql中的多行选择具有或不具有特定条件的组

gpfsuwkq  于 2021-06-27  发布在  Hive
关注(0)|答案(3)|浏览(234)

我有这样的数据:

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

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

ID
234
456

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

j7dteeu8

j7dteeu81#

您可以使用聚合和 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;
hts6caw3

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
;
j8ag8udp

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;

相关问题