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

smtd7mpg  于 2021-06-26  发布在  Hive
关注(0)|答案(2)|浏览(350)

我找不到一个办法使这项工作:我需要得到所有 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` 或者 `false` 如果条件满足,但不能得到相应的 `id1` 有了它-我需要它,因为我想运行在更大的集(不是 `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)

xcitsw88

xcitsw881#

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
mm9b1k5b

mm9b1k5b2#

编辑

这显然是有可能做到这一点,在一次去,这防止污染您的数据库。请看@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;

请注意,“notempty”不是一个明确的定义,因此您可能需要调整第二行中的where语句以满足您的需要。

相关问题