SQL Server:如何根据最近的日期时间检索所有记录

Posted

技术标签:

【中文标题】SQL Server:如何根据最近的日期时间检索所有记录【英文标题】:SQL Server: How to retrieve all record based on recent datetime 【发布时间】:2021-12-19 17:43:01 【问题描述】:

首先,如果在其他地方问过这个问题,我很抱歉,因为我找不到任何解决方案。我得到的最好的结果是检索最新的 1 条记录或 2-3 条记录。我更倾向于根据最近的 Datetime 值搜索所有记录(数字可能是动态的,可能是 1 或 2 或 50+)。那么基本上这里就是问题所在,

我有一张如下表,

APILoadDatetime RowId ProjectId Value
2021-07-13 15:09:14.620 1 Proj-1 101
2021-07-13 15:09:14.620 2 Proj-2 81
2021-07-13 15:09:14.620 3 Proj-3 111
2021-07-13 15:09:14.620 4 Proj-4 125
2021-05-05 04:46:07.913 1 Proj-1 99
2021-05-05 04:46:07.913 2 Proj-2 69
2021-05-05 04:46:07.913 3 Proj-3 105
2021-05-05 04:46:07.913 4 Proj-4 115
... ... ... ...

我想做的是,写一个查询,它将根据日期时间给我所有最近的数据,所以在这种情况下,我应该得到以下结果,

APILoadDatetime RowId ProjectId Value
2021-07-13 15:09:14.620 1 Proj-1 101
2021-07-13 15:09:14.620 2 Proj-2 81
2021-07-13 15:09:14.620 3 Proj-3 111
2021-07-13 15:09:14.620 4 Proj-4 125

RowId 显示(顾名思义)给出了特定 Datetime 块的行数。这并不总是 4,它是根据收到的数据动态的,因此可能是 1、2、4 甚至 50+ ...

希望我能够正确传达问题,感谢大家的阅读,并预先感谢那些提供解决方案的人。

【问题讨论】:

所以你想要最近日期时间的所有行? 是的。请记住,每个日期时间的行数可能会有所不同,有时可能更少,有时可能更多 - 我所追求的是从收到数据的最近日期时间获取所有行。 【参考方案1】:

您可以使用窗口函数row_number 查找每个projectid 的最新条目:

select * from (
   select * , rank() over (order by APILoadDatetime desc) rn
   from tablename
) t where rn = 1

【讨论】:

感谢您的回答,遗憾的是无法对 ProjectId 进行分区,因为有时,有一些未知的项目被分配为“未知”,并且在任何给定的日期时间这些项目可能很多(例如,5-6 次),所有这些都需要选择。上面的 SQL 只选择了这些 ProjectId 的最后一次出现。 @rac3b3nn0n 所以它完全基于日期/时间?我不跟。在您的示例数据中,您有 projectid 是的,示例数据中确实有 ProjectId,但 ProjectId 不是唯一的,不是主键,一个日期时间,我们可以有大量的 ProjectId,认为它更像是雇用的不同机器项目,所以我们可以为一个项目租用 6-7 台机器。希望现在有意义... @rac3b3nn0n 那么你就不需要分区了。查看更新的答案 真棒@eshirvana,当然非常简单......非常感谢......【参考方案2】:
select top 1 with ties 
    * 
from 
     tablename
order by 
    row_number() over(
        partition by RowId 
        order by APILoadDatetime desc
    );

TOP 1 在此处与 WITH TIES 一起使用。

WITH TIES 表示当ORDER BY = 1 时,SELECT 获取这条记录(因为TOP 1)以及所有其他拥有ORDER BY = 1 的记录(因为WITH TIES)。

更新 #1:

如果您需要APILoadDatetime 的最后一条记录以及可能具有相同APILoadDatetime 的几条记录(与第一个找到的一样),则查询更简单:

select top 1 with ties 
    * 
from 
    tablename
order by 
    APILoadDatetime desc;

【讨论】:

确实是一个很好的脚本,但是有一个问题。有时特定日期时间的行数更高或更低,就像在我拥有的数据中一样,有时过去日期的 RowID 超过 4 并且是 7,所以这个脚本给了我所有 4 行最新的日期时间,但随后还为这些特定行提供了最新日期时间的另外 3 行。我的要求是获得我最近收到的仅有的 4 行,而在此之前没有。谢谢 @rac3b3nn0n 请看我的Update #1 哦真棒@Vadim ...非常感谢...是的,这肯定很简单,没想到会这么简单:) ...非常感谢

以上是关于SQL Server:如何根据最近的日期时间检索所有记录的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server:根据列中的日期返回最近的记录

如何根据最近的日期属性获取两个字段?

检索每条记录 SQL Server 的上一个日期

使用 VB.NET 表单从 SQL Server 到 Excel 的日期数据检索

如何在 SQL Server 中选择最近 7 天的日期

sql server 如何将日期时间字段修改成最接近该时间的整点时间?