Obtener 2 últimos registros concatenados con SQL Oracle usando rownum

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

Deja un comentario