Oracle
 sql >> Base de données >  >> RDS >> Oracle

Recherche de dates manquantes dans une séquence

Pour obtenir une liste simple des ID avec des lacunes, sans plus de détails, vous devez regarder chaque ID séparément, et comme @mikey l'a suggéré, vous pouvez compter le nombre de mois et regarder la première et la dernière date pour voir si combien mois qui s'étendent.

Si votre table a une colonne appelée month (depuis date n'est pas autorisé à moins qu'il ne s'agisse d'un identifiant entre guillemets), vous pouvez commencer par :

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

Comparez ensuite le nombre avec la durée du mois, dans un having clause :

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

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

Si vous pouvez en fait avoir plusieurs enregistrements dans un mois pour un ID, et/ou si la date enregistrée peut ne pas être le début du mois, vous pouvez faire un peu plus de travail pour normaliser les dates :

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;