1

残念ながら、SQL は私には簡単にはわかりません。Loanテーブルとテーブルの2つのテーブルがありLoanPaymentsます。

LoanPayments テーブル:

ID (主キー)、LoanID (ローン テーブルの ID と一致)、PaymentDate、Amount など。

毎月入力された最後の支払いを提供できるSQLステートメントが必要です(ある場合)。私の現在の声明は私に結果を与えていません。その月の最大の日付が同点になることもあるという問題もあるので、それにも対処できるようにする必要があります (私の考えでは、同点の場合は最大の 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 か月分の支払いのみを受け取ります。この問題を解決するために時間を割いていただき、ありがとうございます。

4

2 に答える 2

10

ここで 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 で取得したい場合は、PARTITION BYリストに LoanID を追加します。関係を維持することに興味がある場合は、RANK()代わりに使用できますROW_NUMBER()

于 2013-07-02T22:37:59.173 に答える
0

ステップ 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

ステップ 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

この方法は、自己結合を行うよりも効率的です。

于 2013-07-02T22:44:00.470 に答える