从附加的交易表中,每笔交易的cardOldValue应该等于上一笔交易的CardNewValue。
我想识别一些可疑卡的TransactionID和CardNumber,这些卡的CardOldValue大于上一次交易的CardNewValue。
在示例中,transactionID''和cardNumber' 1234'应该被捕获,因为它比之前的交易卡更新,超值50'。
以下是我到目前为止所做的,但它并没有给我我所追求的数据。显然我不太确定自我加入的工作方式:
SELECT
f1.TransactionID, f1.cardNumber, f1.cardOldValue,
f2.cardNewValue, f1.transactionDate, f2.transactionDate
FROM
Transaction f1, Transaction F2
WHERE
f2.transactionDate = (SELECT MAX(transactionDate)
FROM Transaction
WHERE transactionDate < f1.transactionDate
AND cardNumber = f2.cardNumber
AND f1.cardOldValue > f2.cardNewValue)
我分别测试了子查询,它给出了比当前日期更早的日期。那么请你告诉我如何正确地加入桌子?
答案 0 :(得分:4)
-- Finding previous record without a LAG() function:
SELECT
this.TransactionID, this.cardNumber , this.transactionDate
, this.cardOldValue, this.cardNewValue
, prev.TransactionID, prev.transactionDate
, prev.cardNewValue
FROM Transaction this
JOIN Transaction prev
ON this.cardNumber = prev.cardNumber -- same card
AND prev.transactionDate < this.transactionDate -- older date
AND NOT EXISTS ( SELECT * -- no dates in between
FROM Transaction mid
WHERE mid.cardNumber = this.cardNumber
AND mid.transactionDate < this.transactionDate
AND mid.transactionDate > prev.transactionDate
)
WHERE this.cardOldValue > prev.cardNewValue -- suspect
;
答案 1 :(得分:1)
如前所述,可以使用LAG功能。查询应如下所示(未测试):
SELECT
f1.TransactionID, f1.cardNumber, f1.cardOldValue, f1.transactionDate,
LAG(cardNewValue) OVER (PARTITION BY cardNumber ORDER BY transactionDate) AS cardNewValue,
LAG(transactionDate) OVER (PARTITION BY cardNumber ORDER BY transactionDate) AS cardNewValue
FROM Transaction f1
这极大地简化了查询。
在MySQL中,这些现代功能不受支持,必须是emulated。
此外,其他SQL版本支持它们:Oracle,PostgreSQL。