2013-06-27 60 views
2

我有一樣的數據表:從GROUP BY和ORDER BY在查詢中選擇頂1

ID Field_name change_date prev_value current_value 

1  USER_NAME 01/01/2013  test   test11 
1  USER_NAME 04/02/2013  test11  test12 
2  USER_GENDER 06/01/2013  M    F 
2  USER_GENDER 02/01/2013  F    M 

當我通過FIELD_NAME和秩序由CHANGE_DATE組,我會得到這樣的

ID Field_name change_date prev_value current_value 
2  USER_GENDER 06/01/2013  M    F 
2  USER_GENDER 02/01/2013  F    M 
1  USER_NAME 04/02/2013  test11  test12 
1  USER_NAME 01/01/2013  test   test11 

現在我需要爲每個field_name選擇前1行。請建議

感謝

編輯:

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(Field_name) 
          from 
          (
           select Field_name,change_date,prev_value,current_value 
           from 
           (select *, 
           row_number() over (partition by Field_name order by change_date desc) as 
           ranker from tbl_User 
           )Z 
           where ranker = 1 and ID = '1' 
          ) 
        FOR XML PATH(''), TYPE 
        ).value('.', 'NVARCHAR(MAX)') 
       ,1,1,'') 

預期輸出:

ID  USER_GENDER USER_NAME 
2   M    
1      test11 
+0

由definiti你已經有了''''''''''''''''''field_name',所以返回的每一行對於'field_name'應該是唯一的。如果循環遍歷結果,每個'field_name'都會有最高的結果。 – Aiias

+0

不,我得到的所有行,但分組,並排序 – user1882705

+0

是你的ID列錯誤,或者你真的有多行共享一個ID? – mikegreen

回答

6

窗口函數應該可以做的伎倆與任何新版本的SQL Server

select ID, Field_name, change_date, prev_value, current_value 
from 
(select *, 
row_number() over (partition by Field_name order by change_date desc) as 
ranker from table 
)Z 
where ranker = 1 
+0

嗨1_CR,我已編輯我的問題...我無法運行該查詢..我擔心的是我不知道我會在表中有多少field_names。所以我需要使用prev_value作爲其值 – user1882705

+0

@ user1882705作爲預期表顯示預期表,發佈一個單獨的問題特定於您的透視要求。在這個論壇上有幾個主要的專家,不幸的是我不是其中之一。 – iruvar