使用略微关闭的时间戳连接两个数据集

时间:2017-07-10 17:28:13

标签: sql oracle join

我有两个表,一个用于事务,另一个用于反映在允许进程之前对每个事务进行的审计。我想将审核结果加入到每笔交易中。遗憾的是,由于系统错误,TransID有时会重复,因此并不总是唯一地标识事务事件。唯一标识事件的是TransID + TransTimestamp。审核员数据中与此交易唯一关联的行是具有相同TransIDAuditTimestamp的行,它是TransTimestamp之前的最新时间戳。 1}}。我在下面尝试过的代码会导致SQL开发人员永久运行:

SELECT Trans.TransID, Audit.AuditTimestamp  
FROM Trans
LEFT JOIN Audit ON Trans.TransID = Audit.TransID  
WHERE Trans.TransTimestamp >= (SELECT MAX(Audit.AuditTimestamp)  
                          FROM Audit
                          WHERE Trans.TransID = Audit.AuditID);

1 个答案:

答案 0 :(得分:0)

如果像transid这样的核心信息被复制,那么这是一个“非常混乱的业务”,没有多少办法可以解决这个问题。

要尝试此查询,我认为您需要将事务划分为有问题的事务和那些没有问题的事务,并且我已经使用COUNT()OVER()来确定事务是否已复制。从那里我们可以使用相关子查询来找到需要这种方法的那些事务的“可能匹配”。可能的匹配需要具有时间戳> =该事务但小于某个允许的时间帧,例如1秒。

从那里我们加入善与恶,以达到(希望)合理的东西。但是,虽然看起来不合理,但确实需要解决源问题。

WITH T AS (
    SELECT
          trans.*
        , COUNT() over(partition by Trans.TransID) tran_count
    FROM Trans
    )
, A2 AS (
    SELECT 
           T.TransID
         , SELECT MIN(Audit.AuditTimestamp) FROM Audit
            WHERE T.TransID = Audit.TransID 
            AND Audit.AuditTimestamp > T.TransTimestamp
            AND Audit.AuditTimestamp < (T.TransTimestamp + interval '1' second) /* change to suit */
            AS ProbableMatch
    FROM T
    WHERE T.tran_count > 1
    )
SELECT 
       T.TransID
     , T.trans_count
     , COALESECE(A1.AuditTimestamp, A2.ProbableMatch) AS AuditTimestamp
     , COALESECE(A1.ID, A3.ID) AS SourceAuditID
FROM T
LEFT JOIN Audit A1 ON T.TransID = A1.TransID AND T.tran_count = 1
LEFT JOIN A2 ON T.TransID = A2.TransID
LEFT JOIN Audit A3 ON A2.TransID = A3.TransID AND A2.AuditTimestamp = A3.AuditTimestamp