我的表有3列:
RecordId
Value
InsertDate
每个RecordId在表格中有多个条目。事实上,该表每天都会更新几次。
如何编写t-sql查询以选择每条唯一记录的所有最新行(基于InsertDate)?
我的t-sql技能不存在。
提前致谢
答案 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开始。
因此,对于每个RecordId
,RowNumber = 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