sql - 如何选择最大日期小于其他日期的行?

标签 sql t-sql

我在编写此 T-SQL 查询时遇到了困难,因此希望获得一些帮助。

有一个表格如下所示:

id | idd (number) | created_on (datetime) | property | old_value | new_value | ... other

这是一个历史日志,反射(reflect)对某些对象的字段所做的更改。

我需要做的是为每个对象选择其给定属性到给定日期的最新状态。

假设数据如下所示:

 
 1 | 10 | 2014-01-01 | 14 | null | 5  
 2 | 10 | 2014-01-03 | 14 | 5    | 10  
 3 | 10 | 2014-01-05 | 14 | 10   | 8  
 4 | 11 | 2014-01-02 | 14 | null | 7  
 5 | 11 | 2014-01-08 | 14 | 7    | 25  
 ...

这样,如果我必须选择 142014-01-10 的最新状态,结果将是:

 3 | 10 | 2014-01-05 | 14 | 10   | 8  
 5 | 11 | 2014-01-08 | 14 | 7    | 25 

如果我必须选择14属性在2014-01-04的最新状态,结果将是:

 2 | 10 | 2014-01-03 | 14 | 5    | 10
 4 | 11 | 2014-01-02 | 14 | null | 7 

到目前为止,我所做的是为单个对象选择所需的值,这非常简单,但我不知道如何扩展查询以包含所有这些值。

最佳答案

您可以使用ROW_NUMBER()

DECLARE @as_of_date DATE = '2014-01-04'

;WITH cte AS ( 
    SELECT  [id], [idd], [created_on], [property], [old_value], [new_value], rn=ROW_NUMBER() OVER (PARTITION BY idd ORDER BY created_on DESC)
    FROM    YourTable
    WHERE created_on <= @as_of_date
)
SELECT  *
FROM    cte
WHERE rn = 1

关于sql - 如何选择最大日期小于其他日期的行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22661155/

相关文章:

sql - 当 SQL 包含变量时在 pgAdmin 中调试 SQL

sql-server - TSQL - 查找购买了两套产品的客户

sql - 使用其他表中的值更新表

sql - 我们可以在 SQL Server 中的两个存储过程之间进行连接吗

sql - 与 null 进行序列 OR 操作

sql - 在表中插入,Sequence.nextval 不起作用

t-sql - 如何为sybase sql实现数组?

sql - TSQL 从连接到不同 ID 的表中选择与 ID 关联的最大值?

php - 将 SQL 查询的值存储在变量中

c# - 使用 C# 将 FoxPro 表导入 SQL - 一个表有效,一个无效