sql >> Base de Datos >  >> RDS >> Oracle

Encontrar brechas de secuencia en una tabla en Oracle

Encontrar brechas de secuencia en una tabla en Oracle

Problema
Desea encontrar todos los espacios en la secuencia de números o en fechas y horas en sus datos. Las brechas podrían
estar en las fechas registradas para una acción dada, o en algún otro dato con una naturaleza lógicamente consecutiva.
Solución
Las funciones LAG y LEAD OLAP de Oracle le permiten comparar la fila actual de resultados con una fila anterior.
El formato general de LAG tiene este aspecto
Retraso (columna o expresión, desplazamiento de fila anterior, valor predeterminado para la primera fila)
La columna o expresión es el valor que se comparará con valores retrasados ​​(anteriores). El desplazamiento de fila anterior
indica cuántas filas antes de la fila actual debe actuar el LAG. Hemos usado '1' en
la siguiente lista para indicar la fila uno anterior a la fila actual. El valor predeterminado para LAG indica qué valor
usar como precedente para la primera fila, ya que no hay una fila cero en una tabla o resultado. Le indicamos a Oracle
que use 0 como el valor ancla predeterminado, para manejar el caso en el que buscamos el día anterior al primero del
mes.
Se puede usar el enfoque de alias de consulta CON en casi todas las situaciones en las que se utiliza una subconsulta, para
reubicar los detalles de la subconsulta delante de la consulta principal. Esto ayuda a la legibilidad y la refactorización del código si
se requiere en una fecha posterior.
Esta receta busca lagunas en la secuencia de días en los que se realizaron los pedidos para el mes de
noviembre de 1999:

with salesdays as
(select extract(day from order_date) next_sale,
lag(extract(day from order_date),1,0)
over (order by extract(day from order_date)) prev_sale
de oe.orders
where order_date between '01-NOV-1999' and '30-NOV-1999')
select prev_sale, next_sale
from salesdays
where next_sale - prev_sale> 1
pedido por prev_sale;
Nuestra consulta expone las brechas, en días, entre las ventas del mes de noviembre de 1999.

VENTA_ANTERIOR VENTA_SIGUIENTE
---------- ----------
1 10
10 14
15 19
20 22
Los resultados indican que después de que se registró un pedido el primer día del mes, no se registró ningún pedido posterior
hasta el día 10. Luego siguió un lapso de cuatro días hasta el 14, y así sucesivamente. Un gerente de ventas astuto
bien podría usar estos datos para preguntar qué estaba haciendo el equipo de ventas en esos días libres y por qué no llegaron pedidos
!