我有一个这样的蜂巢表-
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.
谁能帮忙?这个查询似乎很简单。谢谢
以下查询适用于任何支持 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;
看看这个: https://cwiki.apache.org/confluence/display/Hive/LanguageManual+SubQueries#LanguageManualSubQueries-SubqueriesintheWHEREClause 这是 Hive SQL 子查询的教程