Encontrando lacunas de sequência em uma tabela no Oracle
ProblemaVocê deseja encontrar todas as lacunas na sequência de números ou em datas e horas em seus dados. As lacunas podem
estar em datas registradas para uma determinada ação ou em alguns outros dados com natureza logicamente consecutiva.
Solução
As funções LAG e LEAD OLAP do Oracle permitem comparar a linha atual de resultados com uma linha anterior.
O formato geral do LAG é assim
Lag (coluna ou expressão, deslocamento da linha anterior, padrão para a primeira linha)
A coluna ou expressão é o valor a ser comparado com valores atrasados (anteriores). O deslocamento de
linha anterior indica em quantas linhas anteriores à linha atual o LAG deve agir. Usamos '1'
na listagem a seguir para significar a linha anterior à linha atual. O padrão para LAG indica qual
valor deve ser usado como precedente para a primeira linha, pois não há linha zero em uma tabela ou resultado. Instruímos o Oracle
a usar 0 como o valor âncora padrão, para lidar com o caso em que procuramos o dia anterior ao
primeiro do
mês.
A abordagem de alias de consulta WITH pode ser usada em quase todas as situações em que uma subconsulta é usada,
realoque os detalhes da subconsulta antes da consulta principal. Isso ajuda a legibilidade e refatoração do código se
necessário em uma data posterior.
Esta receita procura lacunas na seqüência de dias em que os pedidos foram feitos para o mês de
novembro de 1999:
com salesdays como
(selecione extrato(day from order_date) next_sale,
lag(extract(day from order_date),1,0)
over (pedido por extrato(day from order_date)) prev_sale
de oe.orders
onde order_date entre '01-NOV-1999' e '30-NOV-1999')
selecione prev_sale, next_sale
de salesdays
where next_sale - prev_sale> 1
pedir por prev_sale;
Nossa consulta expõe os intervalos, em dias, entre as vendas do mês de novembro de 1999.
PREV_SALE PRÓXIMA_VENDA
---------- ----------
1 10
10 14
15 19
20 22
Os resultados indicam que após um pedido ser registrado no primeiro dia do mês, nenhum pedido subsequente
foi registrado até o dia 10. Em seguida, seguiu-se um intervalo de quatro dias até o 14º e assim por diante. Um gerente de vendas astuto
poderia usar esses dados para perguntar o que a equipe de vendas estava fazendo naqueles dias de folga e por que nenhum pedido
entrou!