sql - 通过 SQL PARTITION 选择最新项目

标签 sql sql-server sql-server-2012 window-functions

注意:我正在尝试学习窗口函数,因此虽然我可以使用 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              |

对我来说,这些查询应该产生相同的结果集。

最佳答案

尝试添加:

OVER (PARTITION BY TestId ORDER BY TestedOn
ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)

我相信升序窗口函数的默认值是:

ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW

https://learn.microsoft.com/en-us/sql/t-sql/queries/select-over-clause-transact-sql

关于sql - 通过 SQL PARTITION 选择最新项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46351176/

相关文章:

sql - 在 delete 语句中忽略聚簇索引和覆盖索引。表扫描发生

mysql - 将 MySQL 简单查询转换为 SQL Server

php 无法连接到 sql server 2008(使用 pdo dblib)

java - 如何在 StringBuilder 中追加星号 * ?

sql - 为什么 SQL 条目是大写的?

sql - 有没有办法在整个过程中持久保存变量?

sql - 从 SQL Server 到 Oracle 使用点表示法与 OpenQuery

t-sql - 如果服务器崩溃,交易会发生什么

synchronization - SQL Server 2012 AlwaysOn同步副本实际上并不同步进行读取

sql - 如何从约会集中返回所有空闲时间段