将代码从Teradata转换为HIVE等级顺序

时间:2019-10-10 18:16:09

标签: sql hive window-functions

在将以下查询从适用于Teradata的语法转换为HIVE时,我需要帮助。

我已经尝试了子查询的副本和过去,但是我无法使qualify子句起作用。

CREATE MULTISET VOLATILE TABLE Month_Shifts AS (
    SELECT "Month"
        , Emp_ID
        , Emp_NM
        , MAX(ending_team) OVER (PARTITION BY Emp_ID ORDER BY "Month" ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING) AS Starting_team
        , ending_team
    FROM
        (
            SELECT "Month"
                , Emp_id
                , current_team AS Ending_team
                , COUNT(DISTINCT call_key) AS CallVolume
            FROM data
            GROUP BY 1,2,3
            QUALIFY ROW_NUMBER() OVER (PARTITION BY "month", Emp_ID, Emp_NM ORDER BY CallVolume DESC) = 1
        ) a
    ) WITH DATA NO PRIMARY INDEX ON COMMIT PRESERVE ROWS;

它应该能够正常运行。当前看到此错误消息: 失败:ParseException行1:260在'QUALIFY'附近'4'缺少EOF

1 个答案:

答案 0 :(得分:1)

在Hive中,您只需将条件移动到外部查询即可:

SELECT "Month", Emp_ID, Emp_NM,
       LAG(ending_team) OVER (PARTITION BY Emp_ID ORDER BY "Month") AS Starting_team,
       ending_team
FROM (SELECT d."month", d.Emp_ID, d.Emp_NM,
             current_team AS Ending_team,
             COUNT(DISTINCT call_key) AS CallVolume,
             ROW_NUMBER() OVER (PARTITION BY "month", Emp_ID, Emp_NM ORDER BY COUNT(DISTINCT call_key) DESC) as seqnum
        FROM data d
        GROUP d."month", d.Emp_ID, d.Emp_NM
    ) d
WHERE seqnum = 1;

注意:

  • 外部查询中的QUALIFY替换为WHERE
  • 请勿将SELECT *GROUP BY一起使用。列出列。无论数据库如何。
  • 配置单元支持LAG(),它更适合外部SELECT