2013-06-27 66 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