2017-07-17 317 views
0

我有一個蜂巢表這樣的 -Hive SQL - 選擇包含值的所有行;其中行的一個相匹配的特定值

Name  ..... Page 
Sid ...........Login 
Sid ...........Buy 
Nancy ......Home 
Nancy ......Register 
Nancy ......Buy 

我想提取所有的行,名在名稱中的一個具有頁=登錄。因此,它會爲name = Sid提取兩行,但對於name = Nancy不提供行。

我試過 -

select * from table where name in (select name from table where page='login'); 

但是,我得到的錯誤 -

Error while compiling statement: FAILED: SemanticException [Error 10249]: Line 1:142 Unsupported SubQuery Expression ''login'': SubQuery expression refers to Outer query expressions only. 

誰能幫助?這個查詢似乎很簡單。由於

+0

你的錯誤是比較奇怪的教程。你能提供樣本數據和期望的結果嗎? –

+0

嗨,真正的數據恐怕是NDA。 –

+0

[Sid and Nancy](https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=3&cad=rja&uact=8&ved=0ahUKEwiFjb_p_5DVAhVI7YMKHeR0DGIQFgg9MAI&url=http%3A%2F%2Fwww.imdb.com %2Ftitle%2Ftt0091954%2F&USG = AFQjCNEIPWeoPdbdbOpLzJbMmLuGnygQ1w)?我在這裏約會自己嗎? – Andrew

回答

0

下面的查詢將在任何地方工作ANSI SQL支持:

SELECT t1.* 
FROM yourTable t1 
INNER JOIN 
(
    SELECT Name 
    FROM yourTable 
    GROUP BY Name 
    HAVING SUM(CASE WHEN Page = 'login' THEN 1 ELSE 0 END) > 0 
) t2 
    ON t1.Name = t2.Name 

的基本策略是爲每名做彙總,計算其中login出現一個頁面的次數,然後只保留那些符合你的標準的名字。在此

select t.* 
from (select t.*, 
      count(case when page = 'login' then 1 else 0 end) over (partition by name) as numlogins 
     from t 
    ) t 
where numlogins > 0; 
+0

感謝你們,當我用你的代碼替換真正的表名時,我不會得到任何結果;我無法分享真實數據,因爲它處於NDA之下。我會多玩這個。 –

+0

@BobbyKing單獨測試子查詢,看它是否返回正確的匹配名稱。如果即使這樣也行不通,那麼也許我的方法不適用於Hive SQL。 –

-1

看:

相關問題