2016-08-15 73 views
0

我有我的数据sometable这样的:HIVE中如何使用“in”中的“in”子句?

col1 col2 col3 
A  B  3 
A  B  1 
A  B  2 
C  B  1 

我想所有包含COL3的某些行的col1col2独特的群体。就像所有包含“2”的col1和col2组。

我想要做这样的事情:

select col1, col2 from sometable 
group by col1, col2 
having col3=1 and col3=2 

但我希望它只是返回在COL3有两个1和2的实例组。所以,查询后的结果应该返回:

col1 col2 
    A  B 

如何在HIVE中表达这一点?谢谢。

+0

如果col1中多于一个元素符合col3中的条件会怎么样,你会怎么写。如果C在col3中也有2个元素,答案会是col1的[A,C](数组)吗? – gobrewers14

回答

0

我不知道为什么其他人删除了正确,然后几乎正确的答案,但我会把他们的备份。

SELECT col1, col2, COUNT(DISTINCT col3) 
FROM 
    sometable 
WHERE 
    col3 IN (1,2) 
GROUP BY col1, col2 
HAVING 
    COUNT(DISTINCT col3) > 1 

如果您确实想要返回符合条件的所有记录,则需要执行子选择并返回主表以获取它们。

SELECT s.* 
FROM 
    sometable s 
    INNER JOIN (
     SELECT col1, col2, COUNT(DISTINCT col3) 
     FROM 
      sometable 
     WHERE 
      col3 IN (1,2) 
     GROUP BY col1, col2 
     HAVING 
      COUNT(DISTINCT col3) > 1 
    ) t 
    ON s.Col1 = t.Col1 
    AND s.Col2 = t.Col2 
    AND s.col3 IN (1,2) 

这样做的依据是窄/行集合筛选到要测试COL3 IN(1,2)的行再算上COL3的DISTINCT值,以确保两个1和2存在,不只是1 & 1或2 & 2.

+0

第一个很棒,谢谢。 – Hunle

0

我认为下面提到的查询将会对您​​的问题有用。

select col1,col2 
from Abc 
group by col1,col2 
having count(col1) >1 AND COUNT(COL2)>2