我在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无法识别'''' '' ''在子查询源
中
答案 0 :(得分:2)
我看到HQL有3个问题:
子查询中的group by需要匹配select语句中的所有非聚合列
您需要为子查询中的TO_DATE(o.order_date)位添加别名,以便在顶级查询中引用它(或参考其系统生成的别名)。如果你没有从子查询中传递o.order_date(并将子查询别名为o),那么如果你试图在超级查询中引用o.order_date,它会阻塞。这也适用于over语句
这可能不会导致问题,但如果您不对子查询进行别名,我使用的大多数HIVE版本都会阻塞。
以下代码应该解决您的问题(假设没有我们在查看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_DATE
和OVER
- 子句中的一些别名。但是您的FROM
部分只是在大括号)
之后没有给定别名的大括号中的查询。
我希望) as o
代替。{/ p>