使用sum时,sql中rank函数的列引用无效

uqzxnwby  于 2021-06-28  发布在  Hive
关注(0)|答案(2)|浏览(261)
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函数中,因为它似乎没有效率。
总体问题:有没有更好的方法来做这个排名?

2eafrhcq

2eafrhcq1#

SELECT *
FROM
    (
       SELECT 
          org_name, 
          org_id,
          adv_name,
          adv_id,
          sum(cost/1000) as mc,
          Rank() over (partition by org_id ORDER by sum(cost/1000) desc) as Rank
       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) r 
WHERE r.Rank <= 5;

正如xqbert所说,“在mc之后最内在的选择很可能是你的主要问题。但是您也可以在最里面的部分执行rank(),选择并消除另一个嵌套查询。此外,您实际上没有聚合第二个查询中的任何内容,因此可以消除第二组groupby条件。

pengsaosao

pengsaosao2#

这就是我想尝试的:
使imps成为cte(公共表表达式: with 语法)是否在imps生成完成之前执行列组,通过使其成为cte,我们将消除这种可能性?
remove group by on r table:window函数,据我所知,不需要group by,既然没有发生其他聚合,为什么我们需要它?这可能会导致问题吗?。
在最里面的查询中去掉了mc后面的逗号(表明这不在代码中,只是问问题时的一个输入错误)
我是一个超级粉丝的根本原因,所以我会添加组,看看它是否仍然有效如果没有,我们可能有罪魁祸首,但不知道为什么。
如果我们添加groupby,它仍然可以工作,那么我们可能会通过强制引擎在对其执行窗口函数之前生成imps来解决执行顺序问题。
.

With imps as (
        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)
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 IMPS) r 
WHERE r.Rank <= 5;

相关问题