回顾一下不止一个记录滞后

时间:2015-12-23 05:11:18

标签: sql sql-server tsql sql-server-2012 window-functions

我有一张桌子跟踪位置上的物品。由于该表由两个独立的系统提供,因此日期可以重叠。让我们称它们为System1和System2。

我使用分区来检查日期重叠的时间,但是当有错误的记录不是相邻行时会遇到障碍。即,System2的第一条记录存在于System1的记录中,因此被丢弃,但System2中的第二条记录要么在System2中最后一条记录结束之前开始,要么同样在最后一条记录内。

为了解决这个问题,我试图捕获System1中的最后结束日期,这样我就可以根据这个值轻松检查我的日期。我的问题是我不太了解分区来做到这一点。我基本上需要分区上的分区。主分区基于PartID,第二个基于SysID,或者你甚至可以使用Source我猜。为了使事情变得整洁,我将唯一记录ID重命名为下面的示例数据中的单个数字ID。

当前代码只是ADTM订购的PartID上的一系列LEAD / LAG语句分区

示例数据: 对于这些数据,我目前正确地识别单个*为错误的记录。然而,带有**的那个是一个未识别的错误,因为它包含在System1的记录3757871中。我需要能够将ID 6的日期与ID 4的日期进行比较,以便我能够识别出该错误。

Source        SysID     PartID   ID       ADTM                SDTM
System1     A8871247    1661181  1   2014-08-15 11:21   2014-08-15 11:35
*System2    1661181     1661181  2   2014-08-15 11:27   2014-08-19 11:04*
System1     A8871247    1661181  3   2014-08-15 11:35   2014-08-16 22:43
System1     A8871247    1661181  4   2014-08-16 22:43   2014-08-20 15:44
*System2    1661181     1661181  5   2014-08-19 11:04   2014-08-19 11:05*
**System2   1661181     1661181  6   2014-08-19 11:05   2014-08-20 15:30**
System2     1661181     1661181  7   2014-08-20 15:30   2014-08-20 15:44
System2     1661181     1661181  8   2014-08-20 15:44   2014-08-22 11:34

我的最终结果是ID 2,5,6,7将被丢弃,而ID 8将把它的ADTM更新为ID 4的SDTM,以在系统之间创建无缝过渡。

基本上我需要的是MAX(SDTM) OVER(PARTITION BY PartID ORDER BY ADTM WHERE Source = 'System1')

1 个答案:

答案 0 :(得分:0)

编辑:我当然不确切地知道您要做什么,但根据您的实际问题,您可以使用以下内容获得所有先前行的最大SDTM:

with t2 as (
    select *, max(SDTM) over (partition by PartID order by ADTM, ID) maxSDTM
    from table_name
)
select *, lag(maxSDTM, 1) over (partition by PartID order by ADTM, ID)
from t2

通过对MAX使用over子句,您将使其成为窗口函数并获得包括当前行在内的所有先前行的最高SDTM。然后,您需要基本上排除当前行,以便您可以使用LAG获取先前的最大值。希望这会有所帮助,抱歉,我不明白你的最终目标。

陈:我可能不理解这个问题,但如果是这样,我的直觉就是使用自我加入。以下查询应标识所有错误:

SELECT *
FROM table_name t
JOIN table_name prev
ON (t.ADTM > prev.ADTM OR (t.ADTM = prev.ADTM AND t.ID > prev.ID))
    AND t.SDTM <= prev.SDTM
    AND t.PartID = prev.PartID