Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Encontrar datas ausentes em uma sequência


Para obter uma lista simples dos IDs com lacunas, sem mais detalhes, você precisa examinar cada ID separadamente e, como @mikey sugeriu, você pode contar o número de meses e ver a primeira e a última data para ver se quantos meses que se estende.

Se sua tabela tiver uma coluna chamada month (desde date não é permitido, a menos que seja um identificador entre aspas) você pode começar com:
select id, count(month), min(month), max(month),
  months_between(max(month), min(month)) + 1 as diff
from your_table
group by id
order by id;

        ID COUNT(MONTH) MIN(MONTH) MAX(MONTH)       DIFF
---------- ------------ ---------- ---------- ----------
       123            8 01-JUN-14  01-JUL-15          14
       456            7 01-MAR-14  01-NOV-14           9
       789            7 01-MAR-14  01-SEP-14           7

Em seguida, compare a contagem com o período de meses, em um having cláusula:
select id
from your_table
group by id
having count(month) != months_between(max(month), min(month)) + 1
order by id;

        ID
----------
       123
       456

Se você pode realmente ter vários registros em um mês para um ID e/ou a data registrada pode não ser o início do mês, você pode fazer um pouco mais de trabalho para normalizar as datas:
select id,
  count(distinct trunc(month, 'MM')),
  min(trunc(month, 'MM')),
  max(trunc(month, 'MM')),
  months_between(max(trunc(month, 'MM')), min(trunc(month, 'MM'))) + 1 as diff
from your_table
group by id
order by id;

select id
from your_table
group by id
having count(distinct trunc(month, 'MM')) !=
  months_between(max(trunc(month, 'MM')), min(trunc(month, 'MM'))) + 1
order by id;