最大日付に基づいて複数の行を含む結果セットを返す


16

次のような子テーブルがあります。

[取引日表]

| Customer ID | Some Date  | Balance |
+-------------+------------+---------+
|           1 | 2012-04-30 |   20.00 |
|           1 | 2012-03-31 |   50.00 |
|           2 | 2012-04-30 |    0.00 |
|           2 | 2012-03-31 |   10.00 | 
|           3 | 2012-03-31 |   60.00 |
|           3 | 2012-02-29 |   10.00 |

このような結果セットを取得できるようにしたいと思います-最新の日付を持つ各クライアントに1つのレコード:

| Customer ID | Some Date  | Balance |
+-------------+------------+---------+
|           1 | 2012-04-30 |   20.00 | 
|           2 | 2012-04-30 |    0.00 |
|           3 | 2012-03-31 |   60.00 |

次のSQL(SQL Server構文)を使用して、個々の「顧客ID」に対してこれを実行できることを知っています。

select top 1  [Some Date], [Customer ID], [Balance]
from [Cust Date Table]
where [Customer ID] = 2
order by [Some Date] desc


| Customer ID | Some Date  | Balance |
+-------------+------------+---------+
|           2 | 2012-04-30 |    0.00 |

しかし、必要な3つのレコードをすべて取得する方法がわかりません。これがサブクエリなどを必要とする状況かどうかはわかりません。

最大日付は、[顧客ID]ごとに異なる可能性があることに注意してください(この例では、顧客3の最大日付は2012-03-31ですが、他のレコードの最大日付は2012-04-30です)。私が試してみました

select [Customer ID], MAX([Some Date]) AS [Latest Date], Balance 
from [Cust Date Table] 
group by [Customer ID], Balance; 

問題は、これが各顧客に対して1行だけを返すのではなく、複数の行を返すことです。

回答:


18

あなたは単に欲しい:

SELECT
    [Customer ID],
    MAX([Some Date]) AS[Latest Date]
FROM[Cust Date TABLE]
GROUP BY
    [Customer ID];

わかりました-あなたはそれを修正しました。行を並べ替えて、一番上の行を選択します。

WITH numbered AS (
    SELECT
        [Customer ID],
        [Some Date],
        [Balance],
        ROW_NUMBER() OVER (
            PARTITION BY
                [Customer ID]
            ORDER BY
                [Some Date] DESC
        ) AS rownum
    FROM[Cust Date TABLE]
)
SELECT
    [Customer ID],
    [Some Date],
    [Balance]
FROM numbered
WHERE
    rownum = 1;

ああ-質問を変更しましたか?
ロブファーリー

今私の答えを変更しました。
ロブファーリー

このソリューションの1つの利点(または要件によっては、欠点)は、同じ顧客の複数の行で最新の日付が発生した場合、重複した結果が生成されないことです。
ティム

7

このようなことをしていると思う

select c.[customer ID], [some date], balance
from [cust date table] c
inner join 
    ( select [customer ID], MAX([some date]) as maxdate
    from [cust date table]
    group by [customer ID]) c2
on c2.[customer ID] = c.[customer ID]
and c2.maxdate = c.[some date]

これには多くのバリエーションがあります。つまり、CTE、テーブル変数、#tableなど、さまざまなバリエーションがあり、自分の状況で最高のパフォーマンスが得られるものを確認できます。


この答えも正しいです。残念ながら、それを支持するのに十分な担当者がいないため、1つの答えを選択する必要があります。
ジョーDBA
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.