2012-02-27 45 views
0

我正在使用SSMS 2008,我創建了一個包含返回許多記錄的sproc的數據集。但是,有一個日期列可以在此數據集中具有相同的值。現在我想要做的是過濾這些記錄,只包含來自這個數據集的最新數據。我如何在T-SQL中做到這一點? (我只想看下面的2/5記錄)。如何指定匹配標準的前N行?

例如:

col A  col B  col C 
AAAAAA BBBBBB 2/5/2012 
AAAAA2 BBBBB2 2/5/2012 
AAAAA3 BBBBB3 2/1/2012 
AAAAA4 BBBBB4 1/25/2012 
AAAAA5 BBBBB5 1/25/2012 
AAAAA6 BBBBB6 1/10/2012 

我想你的solutoin安德烈亞斯,但現在我得到的錯誤:

消息102,級別15,狀態1,行74附近有語法錯誤) 」。

下面的代碼片段:

select * 
from (
    select *, row_number() over(partition by [test_details_answers_expanded_view].[actual_date] 
    order by [test_details_answers_expanded_view].[actual_date] desc) rowno 
    from 
    (
Select 
    [test_details_answers_expanded_view].[event_log_id], 
... 
[test_details_answers_expanded_view].[actual_date], 
... 
FROM #TEMP_EVENT_LOG A 
JOIN [evolv_reports].[dbo].[test_header_rv] ON A.[event_log_id] = [test_header_rv].[event_log_id] 
CROSS APPLY [dbo].[fn_getTestSetupFormDetails](null, [test_header_rv].[test_setup_header_id]) AS [test_header] 
CROSS APPLY [dbo].[fn_getTestSetupFormDetails]([test_header].[test_setup_details_id], null) AS [test_details] 
JOIN [evolv_reports].[dbo].[test_details_answers_expanded_view] ON 
     [test_header_rv].[test_header_id] = [test_details_answers_expanded_view].[test_header_id] 
    AND [test_details].[test_setup_details_id] = [test_details_answers_expanded_view].[test_setup_details_id] 
Where 
(@TestHeaderCode Is Null OR [test_header].[test_header_code] = @TestHeaderCode) 
    AND (@TestHeaderID Is Null OR [test_header_rv].[test_header_id] = @TestHeaderID) 
) t 
where rowno = 1 

你能告訴我做錯了什麼嗎?

回答

0

下面是一個例子使用ROW_NUMBER:

select * 
from (
    select *, row_number() over(partition by [col c] order by [col c] desc) rowno 
    from table 
) t 
where rowno = 1 
+0

是的,但如果我使用TOP說法,難道我需要知道的記錄數爲它選擇?我希望這是一個動態的解決方案,它將選擇最新的記錄,而不管它的行數。 – salvationishere 2012-02-27 22:11:27

+0

@salvationishere誤解了你的問題,請看我更新的答案。 – 2012-02-27 22:24:58

+0

安德烈亞斯,你能檢查一下我的修改過的描述嗎? – salvationishere 2012-02-27 22:35:56