viernes, 30 de enero de 2015

Traer el último registro de un grupo de registros


Traer el último, primer, etc.  registro de un grupo de registros

En algún momento necesite consultar el último registro ingresado en una tabla detalle por cada registro de la tabla padre, No es traer los primer registro de una consulta “TOP 1”. Para hacerme entender, he creado el siguiente ejemplo:

Tabla maestra “Cliente”
IdCliente
Cliente
1
Homero
2
Barth
3
Lisa
4
Batman
5
Superman

Tabla detalle “Factura”
IdFactura
IdCliente
Valor
Fecha
1
1
50
01/01/2015
2
1
55
01/01/2015
3
1
45
03/01/2015
4
2
38
03/01/2015
5
2
45
03/02/2015
6
3
60
01/02/2015
7
4
54
15/01/2015
8
4
66
03/02/2015
9
5
70
02/02/2015
10
5
62
03/01/2015
11
5
33
02/01/2015

La consulta de todos los datos:
Select Cliente.IdCliente
       ,Cliente.Cliente
       ,Factura.IdFactura
       ,Factura.Fecha
        ,Factura.Valor
From Cliente
     Inner Join Factura On Cliente.IdCliente = Factura.IdCliente

El resultado:
IdCliente
Cliente
IdFactura
Fecha
Valor
1
Homero
1
01/01/2015
50
1
Homero
2
01/01/2015
55
1
Homero
3
03/01/2015
45
2
Barth
4
03/01/2015
38
2
Barth
5
03/02/2015
45
3
Lisa
6
01/02/2015
60
4
Batman
7
15/01/2015
54
4
Batman
8
03/02/2015
66
5
Superman
9
02/02/2015
70
5
Superman
10
03/01/2015
62
5
Superman
11
02/01/2015
33


Ahora necesito extraer la última factura registrada por cada cliente, para eso necesitamos traer el máximo IdFactura por cliente. Para lo anterior utilizo una sub consulta en el Inner Join que me permita traer el máximo IdFactura ingresado por cliente y posteriormente lo incluyo como parte de un segundo Inner Join para poder traer la data como se puede apreciar en la siguiente tabla.

IdCliente
Cliente
IdFactura
Fecha
Valor
1
Homero
3
03/01/2015
45
2
Barth
5
03/02/2015
45
3
Lisa
6
01/02/2015
60
4
Batman
8
03/02/2015
66
5
Superman
11
02/01/2015
33

A continuación la consulta.
Select Cliente.IdCliente
,Cliente.Cliente
,Factura.IdFactura
,Factura.Fecha
       ,Factura.Valor
From Cliente
Inner Join (Select Max(IdFactura) As Id, IdCliente From Factura Group By IdCliente) As Fact On Cliente.IdCliente = Fact.IdCliente
        Inner Join Factura On Cliente.IdCliente = Factura.IdCliente  And Fact.Id = Factura.IdFactura
Order By IdCliente

No es la más eficiente pero es una manera de consultar muy sencilla.

Entrada destacada

Arquitectura de N-Capas con Visual Studio .NET y AngularJS

Este artículo es el primero de una serie de artículos en que quiero explicar mi visión de la programación por capas. La Arquitectura ...