ORA-00904: "PREV_TEMP": неверный идентификатор с функцией LAG - PullRequest
1 голос
/ 24 мая 2019

Что не так с этим запросом?

Возвращает: 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 ]

3 голосов
/ 24 мая 2019

Что неверно в запросе, так это то, что псевдонимы столбцов нельзя использовать повторно в предложениях SELECT, WHERE, FROM или GROUP 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; 
3 голосов
/ 24 мая 2019

Вы не можете использовать напрямую, но нужно использовать в подзапросе, чтобы иметь возможность использовать возвращаемое значение из аналитической функции окна

SELECT *
  FROM
  (
   SELECT Id, RecordDate, Temperature, 
          LAG(Temperature) OVER (ORDER BY RecordDate) as prev_temp
     FROM Weather
  )
  WHERE Temperature > prev_temp;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...