Функция LAST_VALUE, вызывающая ошибку: «Недействительно в списке выбора ...» SQL - PullRequest
0 голосов
/ 06 августа 2020

Мне нужно получить самое последнее значение для данного поля в соответствии с датой ввода. Когда я пытаюсь использовать функцию LAST_VALUE, я получаю следующее сообщение об ошибке «Произошла ошибка при выполнении запроса. Столбец« SCAObservation.ObsDtm »недопустим в списке выбора, поскольку он не содержится ни в агрегатной функции, ни в предложении GROUP BY. ". 'SCAObservation.ObsDtm' агрегируется в списке выбора, но не функция LAST_VALUE. Когда я добавляю его в предложение GROUP BY, данные не извлекаются правильно. Что мне не хватает? Вот часть кода:

SELECT
,MAX(SCAObservation.ObsDtm) AS Max_ObsDtm
,MIN(SCAObservation.ObsDtm) AS Min_ObsDtm
,COUNT(DISTINCT SCAObservation.ObsDtm) AS Count_ObsDtm
,LAST_VALUE(SCAObservation.ObsValue) OVER (ORDER BY SCAObservation.ObsDtm ASC) AS Max_ObsValue

1 Ответ

0 голосов
/ 06 августа 2020

LAST_VALUE() - это оконная функция, а не функция агрегирования. Вы можете делать то, что хотите:

SELECT DISTINCT MAX(o.ObsDtm) OVER () AS Max_ObsDtm,
       MIN(o.ObsDtm) OVER () AS Min_ObsDtm,
       COUNT(DISTINCT o.ObsDtm) OVER () AS Count_ObsDtm,
       LAST_VALUE(o.ObsValue) OVER (ORDER BY o.ObsDtm ASC) AS Max_ObsValue
FROM SCAObservation o;

Однако это не будет делать то, что вы действительно хотите. Я подозреваю, что вам нужна условная агрегация:

SELECT MAX(o.ObsDtm AS Max_ObsDtm,
       MIN(o.ObsDtm)AS Min_ObsDtm,
       COUNT(DISTINCT o.ObsDtm) AS Count_ObsDtm,
       MAX(CASE WHEN seqnum = 1 THEN o.ObsValue END) AS Max_ObsValue
FROM (SELECT o.*, ROW_NUMBER() OVER (ORDER BY o.ObsDtm) as seqnum
      FROM SCAObservation o
     ) o;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...