ORA-00904: "PREV_TEMP": 具有 LAG 函数的无效标识符
ORA-00904: "PREV_TEMP": invalid identifier with LAG function
这个查询有什么问题?
它returns:
ORA-00904: "PREV_TEMP": invalid identifier
SELECT Id, RecordDate, Temperature, LAG(Temperature) OVER (ORDER BY RecordDate) as prev_temp
FROM Weather
WHERE Temperature > prev_temp;
SQL 架构:
Create table If Not Exists Weather (Id int, RecordDate date, Temperature int)
Truncate table Weather
insert into Weather (Id, RecordDate, Temperature) values ('1', '2015-01-01', '10')
insert into Weather (Id, RecordDate, Temperature) values ('2', '2015-01-02', '25')
insert into Weather (Id, RecordDate, Temperature) values ('3', '2015-01-03', '20')
insert into Weather (Id, RecordDate, Temperature) values ('4', '2015-01-04', '30')
不能直接使用,需要在子查询中使用才能使用解析函数的返回值
SELECT *
FROM
(
SELECT Id, RecordDate, Temperature,
LAG(Temperature) OVER (ORDER BY RecordDate) as prev_temp
FROM Weather
)
WHERE Temperature > prev_temp;
查询的错误在于,列别名不能是 SELECT
、WHERE
、FROM
或 GROUP BY
子句中的 re-used,其中他们被定义。这适用于 window 功能,以及其他一切。而这是SQL中的规则,而不是Oracle中的规则(虽然有些数据库放宽了对GROUP BY
的限制)。 =16=]
对于您的情况,基本上有两种解决方案,子查询和 CTE:
WITH w AS (
SELECT w.*,
LAG(Temperature) OVER (ORDER BY RecordDate) as prev_temperature
FROM weather w
)
SELECT Id, RecordDate, Temperature, prev_temp
FROM w
WHERE Temperature > prev_temp;
这个查询有什么问题?
它returns:
ORA-00904: "PREV_TEMP": invalid identifier
SELECT Id, RecordDate, Temperature, LAG(Temperature) OVER (ORDER BY RecordDate) as prev_temp
FROM Weather
WHERE Temperature > prev_temp;
SQL 架构:
Create table If Not Exists Weather (Id int, RecordDate date, Temperature int)
Truncate table Weather
insert into Weather (Id, RecordDate, Temperature) values ('1', '2015-01-01', '10')
insert into Weather (Id, RecordDate, Temperature) values ('2', '2015-01-02', '25')
insert into Weather (Id, RecordDate, Temperature) values ('3', '2015-01-03', '20')
insert into Weather (Id, RecordDate, Temperature) values ('4', '2015-01-04', '30')
不能直接使用,需要在子查询中使用才能使用解析函数的返回值
SELECT *
FROM
(
SELECT Id, RecordDate, Temperature,
LAG(Temperature) OVER (ORDER BY RecordDate) as prev_temp
FROM Weather
)
WHERE Temperature > prev_temp;
查询的错误在于,列别名不能是 SELECT
、WHERE
、FROM
或 GROUP BY
子句中的 re-used,其中他们被定义。这适用于 window 功能,以及其他一切。而这是SQL中的规则,而不是Oracle中的规则(虽然有些数据库放宽了对GROUP BY
的限制)。 =16=]
对于您的情况,基本上有两种解决方案,子查询和 CTE:
WITH w AS (
SELECT w.*,
LAG(Temperature) OVER (ORDER BY RecordDate) as prev_temperature
FROM weather w
)
SELECT Id, RecordDate, Temperature, prev_temp
FROM w
WHERE Temperature > prev_temp;