首页 > 解决方案 > SQL Server 2008 找到最后一个时间戳记录

问题描述

我正在尝试查询表以查找最后一条记录。目前我已经尝试了各种解决方案,例如此代码,但我无法使其工作(见下文)

我试图查询的字段来自这个表[CMI_Industry_Workload].[dbo].[Gantt_Value],并且是[ProjectName][TimeStamp]

第一个字段是字符串字段,第二个字段是时间戳字段。

select t.*
from  (Select t.*
              row_number() over (partition by [ProjectName] order by [Timestamp]) as seqnum,
              count(*) over (partition by [ProjectName]) as cnt
       from [CMI_Industry_Workload].[dbo].[Gantt_Value] t
      ) t
where seqnum in (1, cnt - 1, cnt);

所以我希望没有最近的记录,而是在那之前的记录。

非常感谢

加里

标签: sql-servertimestamp

解决方案


这应该在表中的最后一条记录之前找到(假设数据按Timestamp字段排序。这将按降序对行进行排序Timestamp,跳过(偏移)1(最后)行并仅获取一行,使其在最后一行之前.

SELECT T.*
FROM [CMI_Industry_Workload].[dbo].[Gantt_Value] AS T
ORDER BY [Timestamp] DESC
OFFSET 1 ROWS
FETCH NEXT 1 ROWS ONLY;

以上适用于 2012+

这是版本ROW_NUMBER

SELECT *
FROM (  SELECT *, ROW_NUMBER() OVER (ORDER BY [Timestamp] DESC) AS Seq
        FROM [CMI_Industry_Workload].[dbo].[Gantt_Value]) AS T
WHERE T.Seq = 2;

这将再次按Timestampdesc 排序,并将选择第二个值(在最后一个之前)。

请记住,MSSQL 2008 已(或即将)不支持。我强烈建议升级。

更新

根据OP的评论,这一定是答案:

SELECT *
FROM (  SELECT *, ROW_NUMBER() OVER (PARTITION BY [ProjectName] ORDER BY [Timestamp] DESC) AS Seq
        FROM [CMI_Industry_Workload].[dbo].[Gantt_Value]) AS T
WHERE T.Seq > 1;

第二次更新

如果Timestamp值恰好是重复的,并且您希望将它们视为相同,则可能需要使用DENSE_RANK()而不是ROW_NUMBER(). 如果当前值与序列中的先前值匹配,它将分配相同的序列号。

SELECT *
FROM (  SELECT *, DENSE_RANK() OVER (PARTITION BY [ProjectName] ORDER BY [Timestamp] DESC) AS Seq
        FROM [CMI_Industry_Workload].[dbo].[Gantt_Value]) AS T
WHERE T.Seq > 1;

推荐阅读