Sql表过滤?

时间:2011-09-21 11:39:45

标签: sql-server-2008

我有一张表ABC

 Id      Sub_id      Date

CS01032 Sub012  2011-09-21 16:29:58.853
CS01033 Sub013  2011-09-21 16:30:09.863
CS01033 Sub014  2011-09-21 16:30:12.113
CS01034 Sub015  2011-09-21 16:37:57.233
CS01035 Sub016  2011-09-21 16:51:52.527
CS01035 Sub017  2011-09-21 16:51:54.430
CS01035 Sub018  2011-09-21 16:51:56.333

我希望过滤此表数据,如

 Id      Sub_id      Date

CS01032 Sub012  2011-09-21 16:29:58.853 
CS01033 Sub014  2011-09-21 16:30:12.113
CS01034 Sub015  2011-09-21 16:37:57.233    
CS01035 Sub018  2011-09-21 16:51:56.333

表示按日期时间排名前1的sub_id顺序的不同ID

1 个答案:

答案 0 :(得分:3)

使用CTE和ROW_NUMBER功能:

;WITH TopData AS
( 
    SELECT  Id, Sub_Id, Date,
       ROW_NUMBER() OVER(PARTITION BY Id ORDER BY Date DESC) AS 'RowNum')
    FROM
       dbo.ABC
)
SELECT Id, Sub_Id, Date
FROM TopData
WHERE RowNum = 1

CTE(公用表格表达式)将按Id对数据进行“分区”,并为每个组的条目ROW_NUMBER提供值,从1开始,按日期降序排序(最新日期优先)。每个组的第一个条目 - 每个Id的最新条目 - 都有RowNum = 1