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.
fuente
Creo que buscas algo como esto
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.
fuente