我在编写此 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 ...
这样,如果我必须选择 14
在 2014-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/