sql-server - 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);
所以我希望没有最近的记录,而是在那之前的记录。
非常感谢
加里
解决方案
这应该在表中的最后一条记录之前找到(假设数据按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;
这将再次按Timestamp
desc 排序,并将选择第二个值(在最后一个之前)。
请记住,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;
推荐阅读
- perl - Perl:在多个目录中的多个文件上运行脚本
- php - 在 CakePHP 3 中更新/插入关联表数据
- python - Python 3 整数地址
- javascript - 如何在点击提交按钮之前检测我被点击的位置
- linux - 使用 sed 替换 apache2.conf 文件中代码块内的文本
- vba - 如何选择列表,如果列表包含使用 word VBA 的特定文本
- python-3.x - mac上的deepchem安装
- html - HTML CSS:带有不寻常角落的边框
- java - 如何在java中通过循环创建多个对象
- python-3.x - python变量赋值索引错误:列表索引超出范围与纸浆