2014-03-26 189 views
2

我很難寫這個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 
... 

這樣,如果我有2014-01-10選擇的物業14最新狀態,其結果必然是:

 
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 

到目前爲止我所管理的是爲單個對象選擇所需的值,這很容易,但我不知道如何擴展查詢以包含所有這些值。

+0

@YuriyRozhovetskiy,是的,有可能是每天每IDD無限數量的記錄。它實際上以'ms'精度存儲爲時間戳。 – svz

回答

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

您可以使用公用表表達式或子查詢:

;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; 
相關問題