2015-06-19 3 views
0

Я использовал приведенный ниже запрос в Hive и получил следующую ошибку синтаксического анализа, хотя в запросе нет никаких проблем.Ошибка анализа при использовании ROW_NUMBER OVER PARTITION по

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

Ну просто упомянуть. Вы используете в своих SELECT некоторые псевдонимы, такие как o.order_date), в своем TO_DATE и инсайдерите свой OVER -clause. Но ваша часть FROM - это просто запрос в фигурных скобках без заданного псевдонима после закрывающей скобки ).

Я бы предпочел вместо этого ) as o.

2

Я вижу 3 проблемы с HQL:

  1. Группа по в суб-запрос должен соответствовать всем без агрегатных столбцов в операторе отбора

  2. Вам нужно псевдоним TO_DATE (o.order_date) в вспомогательном запросе, чтобы ссылаться на него в запросе верхнего уровня (или ссылаться на его сгенерированный системой псевдоним). Он задохнется, если вы попытаетесь ссылаться на o.order_date в супер-запросе, если вы не передадите o.order_date из подзапроса (и, как и запрос sub, как o). Это также относится к вызову o.order_date в верхнем выражении

  3. Возможно, это не вызывает проблем, но большинство версий 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