El otro día, un amigo me preguntó como podía hacer para obtener los 2 últimos registros (con mayor fecha) ingresados en una tabla, pero concatenados.
Realmente estaba con la cabeza en otra cosa, pero generalmente me intereso por ese tipo de “rompecabezas” SQL y bueno me pareció interesante publicarlo.
Ejemplo:
Tenemos una tabla llamada “Entradas”
La cual tiene una clave que llamaremos “Codigo”, un campo “Fecha” que es el criterio de ordenación, y un campo “Otros” que simula el resto de los campos de la tabla.
Para filtrar los 2 últimos registros pensé en usar “rownum”, pero el problema era que los últimos registros ingresados, no coincidían con los últimos correspondientes a las fechas digitadas.
Ejemplo:
Haciendo un select ordenado por fecha descendiente mis últimos 2 registros son los de código 31 y 28
Select Codigo,Fecha,Otros from Entradas order by Fecha Desc
31, 07/09/2007, xxx
28, 06/09/2007, yyy
29, 05/09/2007, zzz
30, 04/09/2007, uuu
…
Pero al utilizar el rownum, como el mismo es parte de la condición, antes del order by simplemente me devuelve los 2 últimos registros ingresados.
Select Codigo,Fecha,Otros where rownum <= 2 order by Fecha Desc
31, 07/09/2007, xxx 30, 04/09/2007, uuu
Solución para obtener los 2 últimos registros ordenados por fecha descendente: Hacer un select ordenado por fecha descendente y a esto aplicar la condición de rownum
select * from
(select Codigo,Fecha,Otros from Entradas order by Fecha Desc)
where rownum <= 2
31, 07/09/2007, xxx 28, 06/09/2007, yyy
Ahora bien, para obtener los 2 últimos registros concatenados, como puedo hacer?
Bien, la solución es aplicar la misma lógica pero para obtener 1 solo registro y luego al resultado de esto, aplicarlo a un producto cartesiando, mostrando aquellos registros en los cuales no se aplique el producto cartesiano entre si mismo।
Ejemplo:
select * from
(select * from
(select Codigo,Fecha,Otros from Entradas order by Fecha Desc)
where rownum = 1) a,
(select * from
(select Codigo,Fecha,Otros from Entradas order by Fecha Desc)
where rownum <= 2) b
where a.Codigo<>b.Codigo
31, 07/09/2007, xxx,28, 06/09/2007, yyy
Espero sea útil para aquellos que algún día se encuentren con este problema.
Personalmente, no se para que mi amigo quería este resultado, pero el desafío fue interesante.
Fabricio De los Santos
Gerencia de Proyectos – Consultoría GeneXus –
ERP Sistemas de Misión Crítica – Bases de Datos.
Vea mis blogs en:
www.fabriciodelossantos.com
Suscríbete a mi newsletter