我有两个表,一个用于事务,另一个用于反映在允许进程之前对每个事务进行的审计。我想将审核结果加入到每笔交易中。遗憾的是,由于系统错误,TransID
有时会重复,因此并不总是唯一地标识事务事件。唯一标识事件的是TransID + TransTimestamp
。审核员数据中与此交易唯一关联的行是具有相同TransID
和AuditTimestamp
的行,它是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);
答案 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