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

uqzxnwby  于 2021-06-28  发布在  Hive
关注(0)|答案(2)|浏览(365)
  1. SELECT
  2. *
  3. FROM(
  4. SELECT
  5. imps.org_name,
  6. imps.org_id,
  7. imps.adv_name,
  8. imps.adv_id,
  9. imps.mc,
  10. Rank() over (partition by imps.org_id ORDER by imps.mc desc) as Rank
  11. FROM(
  12. SELECT
  13. org_name,
  14. org_id,
  15. adv_name,
  16. adv_id,
  17. sum(cost/1000) as mc,
  18. FROM
  19. table1
  20. WHERE
  21. org_id in (12345, 54321)
  22. AND
  23. date
  24. BETWEEN
  25. '2016-09-10'
  26. AND
  27. '2016-11-01'
  28. GROUP BY
  29. adv_id,
  30. org_name,
  31. org_id,
  32. adv_name) imps
  33. GROUP BY
  34. imps.org_name,
  35. imps.org_id,
  36. imps.adv_name,
  37. imps.adv_id) r
  38. WHERE r.Rank <= 5;

当运行这个查询时,我得到一个错误

  1. FAILED: SemanticException Failed to breakup Windowing invocations into Groups. At least 1 group must only depend on input columns. Also check for circular dependencies.
  2. Underlying error: org.apache.hadoop.hive.ql.parse.SemanticException: Line 10:65 Invalid column reference 'mc'

因为该列定义得很清楚,所以不确定它抛出错误的原因。我尝试过sum(imps.mc),这似乎很管用,但我不太习惯将sum放在rank函数中,因为它似乎没有效率。
总体问题:有没有更好的方法来做这个排名?

2eafrhcq

2eafrhcq1#

  1. SELECT *
  2. FROM
  3. (
  4. SELECT
  5. org_name,
  6. org_id,
  7. adv_name,
  8. adv_id,
  9. sum(cost/1000) as mc,
  10. Rank() over (partition by org_id ORDER by sum(cost/1000) desc) as Rank
  11. FROM
  12. table1
  13. WHERE
  14. org_id in (12345, 54321)
  15. AND date BETWEEN '2016-09-10' AND '2016-11-01'
  16. GROUP BY
  17. adv_id,
  18. org_name,
  19. org_id,
  20. adv_name) r
  21. 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来解决执行顺序问题。
.

  1. With imps as (
  2. SELECT
  3. org_name,
  4. org_id,
  5. adv_name,
  6. adv_id,
  7. sum(cost/1000) as mc
  8. FROM
  9. table1
  10. WHERE
  11. org_id in (12345, 54321)
  12. AND
  13. date
  14. BETWEEN
  15. '2016-09-10'
  16. AND
  17. '2016-11-01'
  18. GROUP BY
  19. adv_id,
  20. org_name,
  21. org_id,
  22. adv_name)
  23. SELECT
  24. *
  25. FROM(
  26. SELECT
  27. imps.org_name,
  28. imps.org_id,
  29. imps.adv_name,
  30. imps.adv_id,
  31. imps.mc,
  32. Rank() over (partition by imps.org_id ORDER by imps.mc desc) as Rank
  33. FROM IMPS) r
  34. WHERE r.Rank <= 5;
展开查看全部

相关问题