Maksimum tarihe göre birden çok satır içeren bir sonuç kümesini döndürme


16

Ben böyle bir şey bir çocuk tablo var:

[Müşteri Tarihi Tablosu]

| 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 |

Ben böyle bir sonuç kümesi elde etmek istiyorum - en son tarih ile her müşteri için bir kayıt:

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

Aşağıdaki SQL (SQL Server sözdizimi) ile her bir "Müşteri Kimliği" için bunu yapabileceğini biliyorum:

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 |

Ama istediğim üç kaydın nasıl alınacağından emin değilim. Bunun bir alt sorgu veya başka bir şey için çağrılan bir durum olup olmadığından emin değilim.

Maksimum tarihin belirli bir [Müşteri Kimliği] için farklı olabileceğini lütfen unutmayın (bu örnekte müşteri 3'ün maksimum tarihi 2012-03-31, diğer kayıtların maksimum tarihi 2012-04-30'dur). denedim

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

Sorun, bu her müşteri için yalnızca bir satır döndürmüyor - birden fazla satır döndürüyor.

Yanıtlar:


18

Sadece şunu istersiniz:

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

Tamam - revize ettin. Şimdi satırları sipariş etmek ve üst sıraları seçmek istiyorsunuz:

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;

Oh - soruyu değiştirdin mi?
Rob Farley

Cevabımı şimdi değiştirdim.
Rob Farley

Bu çözümün bir avantajı (veya gereksinimlerinize bağlı olarak dezavantaj), en son tarih aynı müşteri için birden fazla satırda gerçekleşirse, yinelenen sonuçlar üretmemesidir.
Tim

7

Bence böyle bir şeyin peşindesin

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]

Durumunuzda neyin en iyi performansı verdiğini görmek için oynayabileceğiniz CTE, tablo değişkeni, #table gibi bir takım varyasyonlar vardır.


Bu cevap da doğrudur. Maalesef onu onaylamak için yeterli temsilcim yok ve bir cevap seçmek zorundayım.
Joe DBA
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.