SQL自连接将当前记录与上一个日期的记录进行比较

时间:2016-05-21 09:02:02

标签: sql

从附加的交易表中,每笔交易的cardOldValue应该等于上一笔交易的CardNewValue。

我想识别一些可疑卡的TransactionID和CardNumber,这些卡的CardOldValue大于上一次交易的CardNewValue。

在示例中,transactionID''和cardNumber' 1234'应该被捕获,因为它比之前的交易卡更新,超值50'。

The transaction table

以下是我到目前为止所做的,但它并没有给我我所追求的数据。显然我不太确定自我加入的工作方式:

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)

我分别测试了子查询,它给出了比当前日期更早的日期。那么请你告诉我如何正确地加入桌子?

2 个答案:

答案 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版本支持它们:OraclePostgreSQL