Devolver un conjunto de resultados con varias filas en función de la fecha máxima


16

Tengo una tabla secundaria que es algo como esto:

[Tabla de fechas de 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 |

Me gustaría poder obtener un conjunto de resultados como este: un registro para cada cliente con la última fecha:

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

Sé que puedo hacer esto para cada "ID de cliente" individual con el siguiente SQL (sintaxis de 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 |

Pero no estoy seguro de cómo obtener los tres registros que quiero. No estoy seguro de si esta es una situación que requiere una subconsulta u otra cosa.

Tenga en cuenta que la fecha máxima puede ser diferente para cualquier [ID de cliente] (en este ejemplo, la fecha máxima del cliente 3 es 2012-03-31, mientras que los otros registros tienen una fecha máxima de 2012-04-30). Yo he tratado

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

El problema es que esto no devuelve solo una fila para cada cliente, sino que devuelve varias filas.

Respuestas:


18

Simplemente quieres:

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

Ok, lo has revisado. Ahora desea ordenar las filas y elegir la superior:

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, ¿has cambiado la pregunta?
Rob Farley

Cambié mi respuesta ahora.
Rob Farley

Una ventaja (o desventaja, según sus requisitos) de esta solución es que si la última fecha se produce en más de una fila para el mismo cliente, no producirá resultados duplicados.
Tim

7

Creo que buscas algo como esto

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]

Hay una serie de variaciones sobre esto, es decir, CTE, variable de tabla, #table, con las que puede jugar para ver qué le ofrece el mejor rendimiento en su situación.


Esta respuesta también es correcta. Desafortunadamente no tengo suficiente representante para votarlo y tengo que elegir una respuesta.
Joe DBA
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.