如何选择最大日期的行,该日期小于其他日期?

时间:2014-03-26 12:31:34

标签: sql tsql

我很难写这个T-SQL查询,所以我很感激一些帮助。

有一个表格如下:

  

id | idd(数字)| created_on(datetime)|财产| old_value | new_value | ......其他

这是一个历史记录日志,反映了对某些对象的字段所做的更改。

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

假设数据如下所示:

 
 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 

到目前为止,我所管理的是为单个对象选择所需的值,这很容易,但我不知道如何扩展查询以包含所有这些值。

2 个答案:

答案 0 :(得分:2)

您可以使用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

答案 1 :(得分:1)

您可以使用公用表表达式或子查询:

;WITH CTE1 (created_on, idd)
AS (
    SELECT MAX(created_on), idd 
    FROM Table_1 
    WHERE created_on < @DateTo
    GROUP BY idd)
SELECT t1.* FROM Table_1 t1
INNER JOIN CTE1 ON t1.created_on = CTE1.created_on and t1.idd = CTE1.idd
ORDER BY idd;


SELECT * FROM Table_1 t1
WHERE t1.created_on = (SELECT MAX(created_on) FROM Table_1 t2 where t1.idd = t2.idd AND created_on < @DateTo)
ORDER BY idd;