我有一张桌子跟踪位置上的物品。由于该表由两个独立的系统提供,因此日期可以重叠。让我们称它们为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')
答案 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