Hive SQL - 选择包含值的所有行;其中一行与特定值匹配

时间:2017-07-17 13:43:17

标签: sql hive

我有一个像这样的Hive表 -

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

我想提取名称的所有行,其中一个名称有一个Page = login。因此,它将为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.

有人可以帮忙吗?这个查询看起来很简单。感谢

3 个答案:

答案 0 :(得分: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作为页面显示的次数,然后仅保留符合条件的名称。

答案 1 :(得分:0)

您可以使用窗口功能执行此操作:

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;

答案 2 :(得分:-1)