2013-07-02 137 views
0

不幸的是,SQL並不是很容易找到我。我有兩張桌子,一張Loan桌子和一張LoanPayments桌子。每月獲得最後一個記錄

LoanPayments表:

ID(主鍵)的LoanID,PAYMENTDATE,金額等

我需要一個SQL語句,可以給我(租借表中的ID相符)每月輸入的最後一筆付款(如果有)。我目前的陳述並沒有給我結果。還有一個問題,那就是有時會在這個月有最好的約會,所以我也需要能夠處理這個問題(我的想法是在平局的情況下選擇最大的ID)。

這是我迄今爲止(我知道這是錯的,但我不知道爲什麼。):

SELECT lp.ID, lp.LoanID, lp.PaymentDate 
FROM LoanPayments lp 
WHERE lp.PaymentDate in (
          SELECT DISTINCT MAX(PaymentDate) as PaymentDate 
          FROM LoanPayments 
          WHERE IsDeleted = 0 
          AND ReturnDate is null 
          GROUP BY YEAR(PaymentDate), Month(PaymentDate) 
         ) 
AND CAST(PaymentDate as date) >= CAST(DATEADD(mm, -24, GETDATE()) as date) 

最後一部分只是過濾,所以我只得到支付的過去24個月中。感謝您的幫助,並花時間幫助解決此問題。

+0

'SELECT TOP 1 ... [查詢] ... ORDER BY myDateColumn DESC' –

+0

這是否應該是聲明開頭的TOP 1?因爲這只是給我表中最新的付款。 – TOlsen

+0

您是否每月只需要一條記錄,或者每個LoanID每月只需記錄一條記錄? –

回答

6

您可以使用ROW_NUMBER()函數在這裏:

SELECT * 
FROM (SELECT lp.ID, lp.LoanID, lp.PaymentDate 
      , ROW_NUMBER() OVER (PARTITION BY YEAR(PaymentDate), Month(PaymentDate) ORDER BY PaymentDate DESC) 'RowRank' 
     FROM LoanPayments lp 
    )sub 
WHERE RowRank = 1 

這只是每個月最近PAYMENTDATE,如果通過的LoanID想讓它你的LoanID添加到列表PARTITION BY。如果你有興趣在維護關係,你可以使用RANK()代替ROW_NUMBER()

+0

這似乎是我需要的。感謝您的快速回復! – TOlsen

0

STEP 1:用一個窗口函數以添加認爲最大PAYMENTDATE按月

SELECT 
    ID, 
    LoanID, 
    PaymentDate, 
    MAX(PaymentDate) OVER(PARTITION BY YEAR(PaymentDate), MONTH(PaymentDate)) AS MaxPaymentDate, 
    ROW_NUMBER() OVER(PARTITION BY PaymentDate ORDER BY ID) AS TieBreaker 
FROM LoanPayments 
WHERE IsDeleted = 0 
AND ReturnDate is null 

STEP 2列:篩選這些結果只是你想要的行

SELECT ID,LoanID,PaymentDate 
FROM (
    SELECT 
    ID, 
    LoanID, 
    PaymentDate, 
    MAX(PaymentDate) OVER(PARTITION BY YEAR(PaymentDate), MONTH(PaymentDate)) AS MaxPaymentDate, 
    ROW_NUMBER() OVER(PARTITION BY PaymentDate ORDER BY ID) AS TieBreaker 
    FROM LoanPayments 
    WHERE IsDeleted = 0 
    AND ReturnDate is null 
) t1 
WHERE PaymentDate = MaxPaymentDate AND TieBreaker = 1 

這種方法比自我連接更有效率。

相關問題