Sql 从具有优化历史数据的表中读取记录
我在我们的组织中有一个项目管理应用程序,在一个计划的过程中,我们可以从中获得超过10ks的记录和每个数据。因此,在我们的第一个数据库中,我们每天存储所有这些10K记录,数据中有任何变化都无关紧要。所以最终桌子越来越大 就是这样 提取日志Sql 从具有优化历史数据的表中读取记录,sql,sql-server,Sql,Sql Server,我在我们的组织中有一个项目管理应用程序,在一个计划的过程中,我们可以从中获得超过10ks的记录和每个数据。因此,在我们的第一个数据库中,我们每天存储所有这些10K记录,数据中有任何变化都无关紧要。所以最终桌子越来越大 就是这样 提取日志 LogID ExtractionTime ------------------------- 1 15/01/2021 2 16/01/2021 3 17/01/2021 .... ... .. ----------
LogID ExtractionTime
-------------------------
1 15/01/2021
2 16/01/2021
3 17/01/2021
....
...
..
--------------------------------
PCode PName LogId
------------------------------
P1234 Project1 1
P5734 Project2 1
P2785 Project3 1
P5854 Project4 1
P6985 Project5 1
P4748 Project6 1
P2233 Project7 1
P1234 Project1 2
P5734 Project2 2
P2785 Project3 2
P5854 Project4_upd 2
P6985 Project5 2
P4748 Project6 2
P2233 Project7 2
P1234 Project1_upd 3
P2785 Project3 3
P5854 Project4 3
P6985 Project5 3
P4748 Project6 3
P2233 Project7 3
P8464 Project8_New 3
.....
...
..
---------------------------------------
在这里,数据被免费复制,这使得管理起来非常困难
因此,我们创建了一种新的处理方法,就像这样,在上面的示例中,您可以看到在提取的3天内发生了非常小的变化
PCode PName LogId
------------------------------
P1234 Project1 1 N
P5734 Project2 1 N
P2785 Project3 1 N
P5854 Project4 1 N
P6985 Project5 1 N
P4748 Project6 1 N
P2233 Project7 1 N
P5854 Project4_upd 2 U
P1234 Project1_upd 3 U
P8464 Project8_New 3 N
P5734 Project2 3 R
.....
...
..
---------------------------------------
如您所见,我们正在添加过去一天中更改的记录,并指定该更改以及N、U或R
从概念上讲,我们需要的是获取我们选择的特定日期的所有数据
例如,如果我选择2021年1月17日,它应该返回
PCode PName LogId
------------------------------
P1234 Project1 1 N
P5734 Project2 1 N
P2785 Project3 1 N
P6985 Project5 1 N
P4748 Project6 1 N
P2233 Project7 1 N
P5854 Project4_upd 2 U
---------------------------------
这意味着它将获取截至该日期的所有记录,即使该logID只有一条记录。logid3也是这样
但老实说,我并没有在查询中找到处理这个问题的最佳方法,因为在这个示例中只有很少的数据。但在实时中,当时间移动时,应该有很多数据,因此我们如何才能以最佳方式获取日期数据。认为这就是您想要的 假设LogId是增量的,您可以根据所需的日期获取LogId,然后获取结果。使用row_number仅列出每个PCode的最新登录
什么是N、U或R?新的、更新的、删除的非常感谢。。但这并不像我预料的那样。我指定了2021-01-16。对于pcodep5854,它应该显示Project4_upd,因为它在当天更新,这意味着日志Id为2。但是它显示了logid1本身的数据。2021-01-17年也是如此。它只显示更新后的P5854。但P1234已更新,5734已删除,8464已新建,不在outputfor(包含在内)中,然后将条件更改为p.LogId,2021-01-17也会发生同样的情况。它只显示更新后的P5854。但P1234已更新,5734已删除,8464已新建,但输出中未显示与问题中预期结果不同的内容。非常感谢,这可能是可能的,但需要更多详细信息。请作为新问题发布。如果这能解决你的问题,也请接受这个答案
select *
from
(
select p.PCode, p.PName, p.LogId, p.Change,
rn = row_number() over (partition by p.PCode order by p.LogId desc)
from Log l
inner join Project p on p.LogId < l.LogId
where l.ExtractionTime = '2021-01-17'
) p
where p.rn = 1
order by PCode