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.