我正在尝试执行以下查询,其中我使用窗口来获取下一个日志时间戳,然后在它与当前时间戳之间进行减法。
SELECT
LEAD(timestamp) OVER (PARTITION BY id ORDER BY timestamp) AS lead_timestamp,
timestamp,
(lead_timestamp - timestamp) as delta
FROM logs;
然而,当我这样做时,我收到以下错误:
失败:SemanticException [错误10004]:第4行:1无效的表别名或列引用'lead_timestamp':(可能的列名是:logs.timestamp,logs.latitude,logs.longitude,logs.principal_id)
如果我放弃这个减法,查询的其余部分就可以了,所以我很难过 - 我是否使用上面错误的AS语法进行lead_timestamp?
答案 0 :(得分:3)
Hive的一个限制是您不能引用在同一查询中指定的别名(HAVING
子句除外)。这是由于代码围绕别名构建的方式。你必须使用子查询来写这个。
SELECT lead_timestamp, timestamp, (lead_timestamp - timestamp) AS delta
FROM (
SELECT LEAD(timestamp) OVER (PARTITION BY id ORDER BY timestamp) AS lead_timestamp,
timestamp
FROM logs
) a;
这很难看,但很有效。