Примечание. Я пытаюсь изучить оконные функции, поэтому, хотя я мог бы сделать это с помощью GROUP BY, я явно намереваюсь использовать оконные функции.
У меня есть следующая таблица результатов теста
| Id | TargetId | TestId | ResultId | TestedOn |
+----+----------+--------+----------+--------------------------+
| 1 | 1 | 1 | 5 | 9/1/2017 6:28:32.220 PM |
| 2 | 1 | 2 | 5 | 9/1/2017 6:28:32.220 PM |
| 3 | 1 | 3 | 5 | 9/1/2017 6:28:32.220 PM |
| 4 | 1 | 1 | 4 | 9/10/2017 6:28:32.220 PM |
| 5 | 1 | 2 | 4 | 9/10/2017 6:28:32.220 PM |
| 6 | 1 | 3 | 5 | 9/10/2017 6:28:32.220 PM |
Я хочу выбрать последний результат для каждого идентификатора теста, поэтому у меня есть следующее:
SELECT DISTINCT
TargetId,
TestId,
FIRST_VALUE(tr.ResultId) OVER (PARTITION BY TestId ORDER BY TestedOn DESC) LatestResultId
FROM
TestResult tr
Я получаю ожидаемый результат
| TargetId | TestId | LatestResultId |
+----------+--------+----------------+
| 1 | 1 | 4 |
| 1 | 2 | 4 |
| 1 | 3 | 5 |
Чего я не понимаю, так это почему этот запрос, в котором вместо использования FIRST_VALUE я использую LAST_VALUE и соответствующим образом сортирую, все же дает другой результат.
SELECT DISTINCT
TargetId,
TestId,
LAST_VALUE(tr.ResultId) OVER (PARTITION BY TestId ORDER BY TestedOn) LatestResultId
FROM
TestResult tr
| TargetId | TestId | LatestResultId |
+----------+--------+----------------+
| 1 | 1 | 4 |
| 1 | 1 | 5 |
| 1 | 2 | 4 |
| 1 | 2 | 5 |
| 1 | 3 | 5 |
| 1 | 3 | 5 |
Для меня эти запросы должны давать один и тот же набор результатов.