T-SQL查询帮助 - 选择唯一分组?

时间:2010-10-14 14:04:32

标签: sql sql-server-2005 tsql

我的表有3列:

 RecordId
Value
InsertDate

每个RecordId在表格中有多个条目。事实上,该表每天都会更新几次。

如何编写t-sql查询以选择每条唯一记录的所有最新行(基于InsertDate)?

我的t-sql技能不存在。

提前致谢

3 个答案:

答案 0 :(得分:3)

您可以使用CTE(通用表格表达式)和排名功能 - 如下所示:

;WITH YourQuery AS
(
     SELECT
        *,
        ROW_NUMBER() OVER (PARTITION BY RecordId ORDER BY InsertDate DESC) 'RowNumber'
     FROM dbo.YourTable
     WHERE InsertDate < DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE()), 0)
)
SELECT *
FROM YourQuery
WHERE RowNumber = 1

CTE(内部SELECT)选择所有行,按RecordId对它们进行分区,按InsertDate降序排序(最新的第一个) - 这样就会为您提供按ID排序的所有记录的列表,InsertDate和RowNumber字段,对于每个新RecordId,从1开始。

因此,对于每个RecordIdRowNumber = 1的条目是最近的条目 - 这是第二个(外部)SELECT正在执行的操作。

答案 1 :(得分:0)

请参阅@ marc_s的答案,但您也一定要在表中添加另一列,该列是该行的唯一ID。对于这个问题并没有那么多,但对于后来的问题你会遇到。即使你不认为你会使用它,有很多充分的理由在桌面上有一个主键。

alter table YourTable
 add Id int identity not null
alter table YourTable
 add constraint "YourTable_PK" primary key ("Id")   

答案 2 :(得分:0)

我认为没有CTE和ROW_NUMBER可能(而且更容易)......或者我错过了什么?

select RecordID, max(InsertDate) 
from YourTable 
group by RecordID