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:如何根据最近的日期时间检索所有记录的主要内容,如果未能解决你的问题,请参考以下文章