【问题标题】:Failed to breakup Windowing invocations into Groups. At least 1 group must only depend on input columns未能将窗口调用分解为组。至少 1 个组必须仅依赖于输入列
【发布时间】:2021-04-22 07:52:34
【问题描述】:

我有一个预订酒店的数据集。 date_in 的格式为“yyyy-MM-dd”。我需要按月选择前 10 家访问量最大的酒店。

SELECT top_visits.date_ci, top_visits.hotel_id, top_visits.count_visits
FROM (
   SELECT  date_ci, hotel_id, COUNT(id) AS count_visits, 
   RANK() OVER (
   PARTITION BY date_ci, hotel_id ORDER BY COUNT(id) DESC) as rank
   FROM ( 
      SELECT id, hotel_id, SUBSTRING(my_tab.date_in, 1, 7) as date_ci 
      FROM my_database.my_tab) x
   ) top_visits
GROUP BY date_ci, hotel_id HAVING rank <= 10;

我收到以下错误:

错误:编译语句时出错:FAILED: SemanticException 未能将窗口调用分解为组。至少1组 必须只依赖于输入列。还要检查循环 依赖关系。潜在错误: org.apache.hadoop.hive.ql.parse.SemanticException:第 4:13 行 表达式不在 GROUP BY 键 'hotel_id' 中

【问题讨论】:

  • PARTITION BY date_ci, hotel_id ORDER BY COUNT(id) DESC) as rank -> PARTITION BY date_ci ORDER BY COUNT(id) DESC) as rank

标签: sql hive hiveql window-functions aggregation


【解决方案1】:

将 COUNT(id) 聚合移动到子查询中,添加 group by:

SELECT top_visits.date_ci, top_visits.hotel_id, top_visits.count_visits
FROM (
      SELECT date_ci, hotel_id, count_visits, 
             RANK() OVER (PARTITION BY date_ci, hotel_id ORDER BY count_visits DESC) as rank
        FROM ( 
              SELECT hotel_id, SUBSTRING(my_tab.date_in, 1, 7) as date_ci,
                     COUNT(id) AS count_visits 
                FROM my_database.my_tab
              GROUP BY hotel_id, SUBSTRING(my_tab.date_in, 1, 7)
             ) x
     ) top_visits
WHERE rank <= 10;

【讨论】:

    【解决方案2】:

    我会建议这样的事情:

    SELECT ymh.*
    FROM (SELECT YEAR(date_in) as yyyy, MONTH(date_in) as mm, hotel_id, 
                 COUNT(*) AS count_visits, 
                 ROW_NUMBER() OVER (PARTITION BY YEAR(date_in), MONTH(date_in), COUNT(*) DESC) as seqnum
          FROM my_database.my_tab
          GROUP BY YEAR(date_in), MONTH(date_in)
         ) ymh
    WHERE seqnum <= 10;
    

    也就是说,有一个聚合和一个窗口函数调用来枚举值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-02
      • 1970-01-01
      • 1970-01-01
      • 2022-01-19
      • 2017-09-16
      • 2018-12-24
      • 1970-01-01
      • 2018-01-07
      相关资源
      最近更新 更多