Restituzione di un set di risultati con più righe in base alla data massima


16

Ho una tabella figlio che è qualcosa del genere:

[Tabella delle date dei cust]

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

Vorrei essere in grado di ottenere un set di risultati come questo: un record per ciascun cliente con la data più recente:

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

So che posso farlo per ogni singolo "ID cliente" con il seguente SQL (sintassi di SQL Server):

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 |

Ma non sono sicuro di come ottenere tutti e tre i record che voglio. Non sono sicuro che si tratti di una situazione che richiede una query secondaria o qualcos'altro.

Si noti che la data massima può essere diversa per qualsiasi [ID cliente] dato (in questo esempio, la data massima del cliente 3 è 31-03-2012, mentre gli altri record hanno una data massima del 30-04-2012). Ho provato

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

Il problema è che questo non restituisce solo una riga per ogni cliente, ma restituisce più righe.

Risposte:


18

Vuoi semplicemente:

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

Ok, l'hai rivisto. Ora vuoi ordinare le righe e scegliere quella in alto:

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 - hai cambiato la domanda?
Rob Farley,

Ho cambiato la mia risposta ora.
Rob Farley,

Un vantaggio (o svantaggio, a seconda delle esigenze) di questa soluzione è che se la data più recente si verifica in più di una riga per lo stesso cliente, non produrrà risultati duplicati.
Tim

7

Penso che tu stia cercando qualcosa del genere

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]

Ci sono una serie di variazioni su questo, ad esempio CTE, variabile da tavolo, #table, con cui puoi giocare per vedere cosa ti offre le migliori prestazioni nella tua situazione.


Anche questa risposta è corretta. Sfortunatamente non ho abbastanza rappresentante per votarlo e devo scegliere una risposta.
Joe DBA,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.