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.
