ORA-00904:“ PREV_TEMP”:具有LAG功能的无效标识符

时间:2019-05-24 11:48:42

标签: sql oracle

此查询出了什么问题?

它返回: 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')

2 个答案:

答案 0 :(得分:3)

您不能直接使用,但需要在子查询中使用才能使用窗口分析函数的返回值

SELECT *
  FROM
  (
   SELECT Id, RecordDate, Temperature, 
          LAG(Temperature) OVER (ORDER BY RecordDate) as prev_temp
     FROM Weather
  )
  WHERE Temperature > prev_temp;

答案 1 :(得分:3)

查询的问题在于列别名不能在定义它们的SELECTWHEREFROMGROUP BY子句中重复使用。这适用于窗口功能以及其他所有功能。这是 SQL 的规则,而不是 Oracle 的规则(尽管某些数据库放宽了对GROUP BY的限制)。

在您的情况下,基本上有两种解决方案,一个子查询和一个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; 
相关问题