在SQL分区上选择最新项
注意:我正在尝试学习窗口函数,所以虽然我可以使用GROUPBY来完成这项工作,但我明确地开始使用窗口函数 我有下表的测试结果在SQL分区上选择最新项,sql,sql-server,sql-server-2012,window-functions,Sql,Sql Server,Sql Server 2012,Window Functions,注意:我正在尝试学习窗口函数,所以虽然我可以使用GROUPBY来完成这项工作,但我明确地开始使用窗口函数 我有下表的测试结果 | Id | TargetId | TestId | ResultId | TestedOn | +----+----------+--------+----------+--------------------------+ | 1 | 1 | 1 | 5 | 9/1/2017 6:28:32.22
| 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_值,而是使用LAST_值并进行相应排序,但这会产生不同的结果
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 |
对我来说,这些查询应该产生相同的结果集。尝试添加:
OVER (PARTITION BY TestId ORDER BY TestedOn
ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
我认为升序窗口函数的默认值是:
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
您可以使用with子句,在
WITH N(TESTID,LATEST_DATE) AS
(SELECT DISTINCT TestId, Max(TestedOn ) OVER(PARTITION BY TestId) FROM TestResult)
Select TestId, ResultId from FROM TestResult TR join N ON TR.TestId = N.TESTID AND TR.TestedOn =N.LATEST_DATE
表“N”只是一个临时表,其中包含TestID和最新日期的列表什么是TargetId?我没有在你的测试结果表中看到它?哇,结果表中没有它-每行都是1。我会修好的。谢谢我的SQL版本似乎不喜欢AND-will查看文档,它应该是无界前向和无界后向之间的
行
,因此我认为,默认情况下,除非另有规定,否则窗口函数只考虑前向行。谢谢