使用ROW_NUMBER OVER PARTITION BY时解析错误

时间:2015-06-19 16:49:09

标签: hive row-number

我在Hive上使用了以下查询,但是在查询似乎没有任何问题的情况下得到了以下解析错误。

SELECT TO_DATE(o.order_date), profit, 
       ROW_NUMBER() OVER (PARTITION BY YEAR(o.order_date) ORDER BY profit desc) AS n 
FROM (
    SELECT TO_DATE(o.order_date), SUM(price) AS revenue, 
           SUM(price-cost) as profit 
    FROM products p, order_details d, orders o 
    WHERE (d.prod_id=p.prod_id) AND (d.order_id=o.order_id) 
    GROUP BY o.order_date
)

错误是:

  编译语句时出现

错误:失败:parseexception行6:22无法识别'''' '' ''在子查询源

2 个答案:

答案 0 :(得分:2)

我看到HQL有3个问题:

  1. 子查询中的group by需要匹配select语句中的所有非聚合列

  2. 您需要为子查询中的TO_DATE(o.order_date)位添加别名,以便在顶级查询中引用它(或参考其系统生成的别名)。如果你没有从子查询中传递o.order_date(并将子查询别名为o),那么如果你试图在超级查询中引用o.order_date,它会阻塞。这也适用于over语句

  3. 中的o.order_date调用
  4. 这可能不会导致问题,但如果您不对子查询进行别名,我使用的大多数HIVE版本都会阻塞。

  5. 以下代码应该解决您的问题(假设没有我们在查看HQL时看不到的数据问题):

    SELECT 
        a.dt, 
        a.profit, 
        ROW_NUMBER() OVER (PARTITION BY YEAR(a.dt) ORDER BY profit desc) AS n 
    FROM
        (SELECT 
             TO_DATE(o.order_date) dt, 
             SUM(price) AS revenue, 
             SUM(price-cost) as profit 
         FROM 
             products p, order_details d, orders o 
         WHERE 
             (d.prod_id = p.prod_id) 
             AND (d.order_id = o.order_id) 
         GROUP BY 
             TO_DATE(o.order_date) ) a
    

答案 1 :(得分:0)

好吧提一下。您在SELECT中使用o.order_date)中的TO_DATEOVER - 子句中的一些别名。但是您的FROM部分只是在大括号)之后没有给定别名的大括号中的查询。

我希望) as o代替。{/ p>