首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >回顾不止一次记录延迟

回顾不止一次记录延迟
EN

Stack Overflow用户
提问于 2015-12-23 13:11:18
回答 1查看 138关注 0票数 0

我有一张表,可以追踪不同位置的物品。由于此表由两个独立的系统馈送,因此日期可以重叠。让我们称它们为System1和System2。

我正在使用分区来检查日期何时重叠,但当出现错误的记录不是相邻行时,就会遇到问题。即,来自System2的第一条记录存在于来自System1的记录中,因此被丢弃,但是System2中的第二条记录要么在System2中最后一条记录的结尾之前开始,要么同样在最后一条记录中。

为了解决这个问题,我尝试在System1中捕获最后一个结束日期,这样我就可以很容易地根据这个值检查我的日期。我的问题是我对分区的了解不够,无法做到这一点。我本质上需要一个分区而不是一个分区。主分区是基于PartID的,第二个分区是基于SysID的,我猜你甚至可以使用源代码。为了简洁起见,在下面的示例数据中,我将唯一的记录id重命名为单数字ID。

当前代码只是一系列由ADTM排序的PartID上的前导/滞后语句分区

示例数据:对于此数据,我当前正确地将带有单个*的记录标识为错误。然而,带有**的错误是一个无法识别的错误,因为它包含在来自System1的记录3757871中。我需要能够将ID 6的日期与ID 4的日期进行比较,这样我才能识别故障。

代码语言:javascript
复制
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')

EN

回答 1

Stack Overflow用户

发布于 2015-12-23 13:47:40

编辑:我当然不知道你到底想要做什么,但根据你的实际问题,你可以使用下面这样的方法得到所有之前行的最大SDTM:

代码语言:javascript
复制
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:我可能不理解这个问题,但如果是这样的话,我的直觉是使用自连接。以下查询应标识所有错误:

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34429011

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档