当其他列具有两个特定值时,请选择一个值

时间:2017-09-04 13:40:22

标签: hive hiveql

我找不到让这项工作的方法:我需要获得id1 id2的所有''(empty string)以及至少非空id2的所有SELECT id1, id2 FROM mytable WHERE id1 = ... GROUP BY id1,id2

我将其视为: id1 id2 1 b2-04af1ab73705-fb8000-006bfb81a78e5e5920 2 b2-04af1ab73705-fb8000-006bfb81a78e5e5920 5835113447594857813

id1

所以现在我需要得到这个true。我尝试了很多东西,但是如果条件满足,我得到的最接近的是falseid1,但是无法获得相应的mytable - 我需要它,因为我想要运行这个在较大的集合上(不是id1=...SELECT if(sum(if(tab1.id1 != '', 1, 0)) < count(tab1.id2), tab1.id1,false) as myguy FROM ( SELECT id1,id2 FROM mytable WHERE id1 = 'b2-04af1ab73705-fb8000-006bfb81a78e5e5920' GROUP BY visitorid,platformvisitorid ) AS tab1 上进行了子集化)。

当我这样尝试时:

Line 1:103 Expression not in GROUP BY key 'visitorid'

,我收到此错误:SELECT tab4.id1 FROM (SELECT tab1.id1 FROM (SELECT id1, id2 FROM mytable GROUP BY id1, id2) tab1 WHERE id2!='') tab3 INNER JOIN (SELECT tab2.id1 FROM (SELECT id1, id2 FROM mytable GROUP BY id1, id2) tab2 WHERE id2='') tab4 ON (tab3.id1 = tab4.id1) 并且无法找到解决方法。

请问任何想法?

修改

在丹尼斯的帮助下解决了以下问题:

Mvc.Mailer

2 个答案:

答案 0 :(得分:2)

select      id1
from        mytable 
group by    id1
having      count(case when id2 =  '' then 1 end) > 0
        and count(case when id2 <> '' then 1 end) > 0

答案 1 :(得分:0)

修改

显然可以在1 go中执行此操作,这可以防止污染您的数据库。请参阅@Dudu Markovitz的答案

可能可以将其构建为1语句,从而消除临时表(或视图)的创建。

CREATE TABLE tempa AS SELECT DISTINCT id1 from mytable where id2 = '';
CREATE TABLE tempb AS SELECT DISTINCT id1 from mytable where id2 != '';

SELECT tempa.id1 FROM tempa INNER JOIN tempb on tempa.id1 = tempb.id1;

请注意,&#39;不是空的&#39;不是一个明确的定义,因此您可能需要调整第二行中的where语句以满足您的需求。