it-swarm-eu.dev

Vrácení sady výsledků s více řádky na základě maximálního data

Mám dětský stůl, který je něco takového:

[Cust Date Table]

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

Chtěl bych mít možnost získat takto nastavený výsledek - jeden záznam pro každého klienta s nejnovějším datem:

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

Vím, že to mohu udělat pro každý jednotlivý „ID zákazníka“ s následující SQL (syntaxe serveru SQL):

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 |

Ale nejsem si jistý, jak získat všechny tři záznamy, které chci. Nejsem si jistý, zda se jedná o situaci, která vyžaduje podtázku nebo něco jiného.

Upozorňujeme, že maximální datum se může lišit pro kterékoli dané [ID zákazníka] (v tomto příkladu je maximální datum zákazníka 3 2012-03-31, zatímco ostatní záznamy mají maximální datum 2012-04-30). zkusil jsem

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

Problém je, že to nevrací pouze jeden řádek pro každého zákazníka - vrací více řádků.

17
Joe DBA

Jednoduše chcete:

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

Dobře - upravili jste to. Nyní si přejete objednat řádky a vybrat horní:

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;
18
Rob Farley

Myslím, že jste po něčem takovém

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]

Existuje celá řada variací, tj. CTE, tabulková proměnná, #table, se kterou si můžete hrát, abyste viděli, co vám ve vaší situaci dává nejlepší výkon.

7
WT_W