【发布时间】:2017-09-21 18:48:20
【问题描述】:
注意:我正在尝试学习窗口函数,所以虽然我可以使用 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 |
我想为每个测试 ID 选择最新结果 - 所以我有以下内容:
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 |
对我来说,这些查询应该产生相同的结果集。
【问题讨论】:
-
什么是 TargetId?我在您的测试结果表中没有看到它?
-
糟糕,结果表中缺少它 - 在每一行中都是 1。会修复它。谢谢!
标签: sql sql-server sql-server-2012 window-functions