Sql 从具有优化历史数据的表中读取记录

Sql 从具有优化历史数据的表中读取记录,sql,sql-server,Sql,Sql Server,我在我们的组织中有一个项目管理应用程序,在一个计划的过程中,我们可以从中获得超过10ks的记录和每个数据。因此,在我们的第一个数据库中,我们每天存储所有这些10K记录,数据中有任何变化都无关紧要。所以最终桌子越来越大 就是这样 提取日志 LogID ExtractionTime ------------------------- 1 15/01/2021 2 16/01/2021 3 17/01/2021 .... ... .. ----------

我在我们的组织中有一个项目管理应用程序,在一个计划的过程中,我们可以从中获得超过10ks的记录和每个数据。因此,在我们的第一个数据库中,我们每天存储所有这些10K记录,数据中有任何变化都无关紧要。所以最终桌子越来越大

就是这样

提取日志

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