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.