我有一张表,可以追踪不同位置的物品。由于此表由两个独立的系统馈送,因此日期可以重叠。让我们称它们为System1和System2。
我正在使用分区来检查日期何时重叠,但当出现错误的记录不是相邻行时,就会遇到问题。即,来自System2的第一条记录存在于来自System1的记录中,因此被丢弃,但是System2中的第二条记录要么在System2中最后一条记录的结尾之前开始,要么同样在最后一条记录中。
为了解决这个问题,我尝试在System1中捕获最后一个结束日期,这样我就可以很容易地根据这个值检查我的日期。我的问题是我对分区的了解不够,无法做到这一点。我本质上需要一个分区而不是一个分区。主分区是基于PartID的,第二个分区是基于SysID的,我猜你甚至可以使用源代码。为了简洁起见,在下面的示例数据中,我将唯一的记录id重命名为单数字ID。
当前代码只是一系列由ADTM排序的PartID上的前导/滞后语句分区
示例数据:对于此数据,我当前正确地将带有单个*的记录标识为错误。然而,带有**的错误是一个无法识别的错误,因为它包含在来自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我的最终结果是ID2、5、6和7将被丢弃,ID8将把它的ADTM更新为ID4的SDTM,以创建系统之间的无缝转换。
基本上我需要的是MAX(SDTM) OVER(PARTITION BY PartID ORDER BY ADTM WHERE Source = 'System1')
发布于 2015-12-23 13:47:40
编辑:我当然不知道你到底想要做什么,但根据你的实际问题,你可以使用下面这样的方法得到所有之前行的最大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获得之前的最大值。希望这对你有所帮助,很抱歉我没有理解你的最终目标。
Old:我可能不理解这个问题,但如果是这样的话,我的直觉是使用自连接。以下查询应标识所有错误:
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.PartIDhttps://stackoverflow.com/questions/34429011
复制相似问题