Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在SQL分区上选择最新项_Sql_Sql Server_Sql Server 2012_Window Functions - Fatal编程技术网

在SQL分区上选择最新项

在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

注意:我正在尝试学习窗口函数,所以虽然我可以使用GROUPBY来完成这项工作,但我明确地开始使用窗口函数

我有下表的测试结果

| 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查看文档,它应该是无界前向和无界后向之间的
,因此我认为,默认情况下,除非另有规定,否则窗口函数只考虑前向行。谢谢