Я пытаюсь выбрать самую последнюю ненулевую запись из моего набора данных в SQL. Большинство примеров этого удовлетворены возвратом только даты и группы по переменным, но я также хотел бы вернуть соответствующее значение. Например:Выберите самую последнюю запись в SQL
ID Date Value
----------------------------
001 2014-10-01 32
001 2014-10-05 10
001 2014-10-17 0
002 2014-10-03 17
002 2014-10-20 60
003 2014-09-30 90
003 2014-10-10 7
004 2014-10-06 150
005 2014-10-17 0
005 2014-10-18 9
Использование
SELECT ID, MAX(Date) AS MDate FROM Table WHERE Value > 0 GROUP BY ID
Возвраты:
ID Date
-------------------
001 2014-10-05
002 2014-10-20
003 2014-10-10
004 2014-10-06
005 2014-10-18
Но всякий раз, когда я пытаюсь включить значение в качестве одного из выбранных переменных, приводит SQLServer к ошибке:
"Column 'Value' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause."
My des IRED результат будет:
ID Date Value
----------------------------
001 2014-10-05 10
002 2014-10-20 60
003 2014-10-10 7
004 2014-10-06 150
005 2014-10-18 9
Одно из решений я подумал бы посмотреть результаты обратно в исходной таблице и возвращает значение, которое соответствует соответствующему ID & Дата (я уже урезана и так Я знаю, что они уникальны), но это кажется мне бесполезным решением. Любая помощь по этому поводу будет оценена по достоинству.
ПРИМЕЧАНИЕ. Я не хочу группировать по значению, так как это результат, который я пытаюсь вытащить в конце (т. Е. Для каждого идентификатора я хочу последнее значение). Дальнейший пример:
ID Date Value
----------------------------
001 2014-10-05 10
001 2014-10-06 10
001 2014-10-10 10
001 2014-10-12 8
001 2014-10-18 0
Здесь я хочу только получить последнюю ненулевую запись. (001, 2014-10-12, 8)
SELECT ID, MAX(Date) AS MDate, Value FROM Table WHERE Value > 0 GROUP BY ID, Value
вернуться бы:
ID Date Value
----------------------------
001 2014-10-10 10
001 2014-10-12 8
All эти самозапуска и т. д. могут быть улучшены с помощью оконных функций. [Пример SQLfiddle] (http://sqlfiddle.com/#!3/afe17/1). –
@AaronBertrand, спасибо. Я уже внедрил код повторной ссылки ниже, прежде чем я прочитал это предложение, но я буду иметь это в виду, если мне когда-либо понадобится перекодировать в будущем. –