SELECT
*
FROM(
SELECT
imps.org_name,
imps.org_id,
imps.adv_name,
imps.adv_id,
imps.mc,
Rank() over (partition by imps.org_id ORDER by imps.mc desc) as Rank
FROM(
SELECT
org_name,
org_id,
adv_name,
adv_id,
sum(cost/1000) as mc,
FROM
table1
WHERE
org_id in (12345, 54321)
AND
date
BETWEEN
'2016-09-10'
AND
'2016-11-01'
GROUP BY
adv_id,
org_name,
org_id,
adv_name) imps
GROUP BY
imps.org_name,
imps.org_id,
imps.adv_name,
imps.adv_id) r
WHERE r.Rank <= 5;
当运行这个查询时,我得到一个错误
FAILED: SemanticException Failed to breakup Windowing invocations into Groups. At least 1 group must only depend on input columns. Also check for circular dependencies.
Underlying error: org.apache.hadoop.hive.ql.parse.SemanticException: Line 10:65 Invalid column reference 'mc'
因为该列定义得很清楚,所以不确定它抛出错误的原因。我尝试过sum(imps.mc),这似乎很管用,但我不太习惯将sum放在rank函数中,因为它似乎没有效率。
总体问题:有没有更好的方法来做这个排名?
2条答案
按热度按时间2eafrhcq1#
正如xqbert所说,“在mc之后最内在的选择很可能是你的主要问题。但是您也可以在最里面的部分执行rank(),选择并消除另一个嵌套查询。此外,您实际上没有聚合第二个查询中的任何内容,因此可以消除第二组groupby条件。
pengsaosao2#
这就是我想尝试的:
使imps成为cte(公共表表达式:
with
语法)是否在imps生成完成之前执行列组,通过使其成为cte,我们将消除这种可能性?remove group by on r table:window函数,据我所知,不需要group by,既然没有发生其他聚合,为什么我们需要它?这可能会导致问题吗?。
在最里面的查询中去掉了mc后面的逗号(表明这不在代码中,只是问问题时的一个输入错误)
我是一个超级粉丝的根本原因,所以我会添加组,看看它是否仍然有效如果没有,我们可能有罪魁祸首,但不知道为什么。
如果我们添加groupby,它仍然可以工作,那么我们可能会通过强制引擎在对其执行窗口函数之前生成imps来解决执行顺序问题。
.