T-SQL查询:仅选择最近的行(对于每个计算机名称)

Tre*_*van 1 sql t-sql

我有一个ComputerStatusSQL Server 2014 Developer Edition数据库中的表,如下所示:

ComputerName       Status          Timestamp
------------       -----------     ------------
client01           Online          2013-04-11 11:00 AM
client01           Online          2013-04-08 10:00 AM
client01           Offline         2013-04-05 09:00 PM
client02           Offline         2013-04-08 10:00 AM
client02           Online          2013-04-03 10:00 AM
client03           Online          2013-04-02 10:00 AM
client03           Offline         2013-04-05 10:00 PM
client03           Online          2013-04-03 12:00 PM
Run Code Online (Sandbox Code Playgroud)

我想要做的是获取Timestamp每个唯一计算机名称的最新(基于)行.虽然我对SQL Server查询非常讨厌,但我知道我可以:

  • 编写一个存储过程来检索最新的条目(对于一台计算机),然后使用游标多次调用该过程
  • 使用以下T-SQL代码(在存储过程中)检索最新行: select top 1 * from ComputerStatus where ComputerName = 'client01' order by Timestamp descending

期望的结果

ComputerName       Status          Timestamp
------------       -----------     ------------
client01           Online          2013-04-11 11:00 AM
client02           Offline         2013-04-08 10:00 AM
client03           Offline         2013-04-05 10:00 PM
Run Code Online (Sandbox Code Playgroud)

我知道如何为一台计算机选择最新的行.我正在努力解决的部分是如何为表中所有独特的计算机执行此操作.这是否需要我使用SQL游标来迭代表中的唯一计算机名称?或者,是否有更有效的方法来实现这些结果?

Sha*_*pta 9

您可以使用RowNumber执行此操作,RowNumber为每行提供行号.由于您希望基于TimeStamp为每个computerName提供从1开始的行号,我们需要通过Computername对其进行分区

select * from (
select *, ROW_NUMBER() over (partition by ComputerName order by Timestamp desc) as rno 
from ComputerStatus
) as T where rno = 1
Run Code Online (Sandbox Code Playgroud)

MSDN