1

データ分析に必要な生データを提供するストアド プロシージャを作成しました。

この SP は、次の構造を持つ一時テーブルを即座に作成します。

CREATE TABLE #Analysis
(
    AgreementID int,
    DueDate datetime,
    DateFrom datetime,
    DateTo datetime,
    AmountDue decimal(9,2),
    AmountPaid decimal(9,2),
    DueTD decimal(9,2),
    PaidTD decimal (9,2),
    ArrearsScore int
)

AgreementID は、このテーブルで 6 レコード上まで繰り返すことができます。

私がする必要があるのは、AgreementID ごとに、最後の 6 行を取得する必要があることです。

これにより、残りの分析を実行できます。

私が試してみました:

    SELECT
          AN.*
    FROM
          #Analysis AS A
    LEFT OUTER JOIN
         (SELECT 
             TOP(6) * 
          FROM 
              #Analysis 
          ORDER BY 
              AgreementID, DueDate DESC
         ) AS AN ON A.AgreementID = AN.AgreementID
    WHERE AN.AgreementID IS NOT NULL

しかし、これでは望ましい結果が得られません。

誰でもアドバイスできますか?

ありがとうございました。

4

1 に答える 1

2

を使用している場合は、とSQL Server 2005+を使用できます。は、レコードが latest からソートされた 1 の値を持つすべてのランクまたは値を示します。Common Table ExpressionWindowing functionROW_NUMBER()AgreementIDDueDate

WITH records
AS
(
    SELECT  AgreementID,
            DueDate,
            DateFrom,
            DateToe,
            AmountDue,
            AmountPaid,
            DueTD,
            PaidTD,
            ArrearsScore,
            ROW_NUMBER() OVER(PARTITION BY AgreementID 
                        ORDER BY AgreementID, DueDate DESC) rn
    FROM    #Analysis
)
SELECT  AgreementID,
        DueDate,
        DateFrom,
        DateToe,
        AmountDue,
        AmountPaid,
        DueTD,
        PaidTD,
        ArrearsScore
FROM    records
WHERE   rn <= 6

使うことなくCTE

SELECT  AgreementID,
        DueDate,
        DateFrom,
        DateToe,
        AmountDue,
        AmountPaid,
        DueTD,
        PaidTD,
        ArrearsScore
FROM    
        (
            SELECT  AgreementID,
                    DueDate,
                    DateFrom,
                    DateToe,
                    AmountDue,
                    AmountPaid,
                    DueTD,
                    PaidTD,
                    ArrearsScore,
                    ROW_NUMBER() OVER(PARTITION BY AgreementID 
                                ORDER BY AgreementID, DueDate DESC) rn
            FROM    #Analysis
        ) records
WHERE   rn <= 6
于 2013-04-16T15:15:58.157 に答える