Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Fehlende Daten in einer Sequenz finden

Um eine einfache Liste der IDs mit Lücken ohne weitere Details zu erhalten, müssen Sie sich jede ID separat ansehen, und wie @mikey vorgeschlagen hat, können Sie die Anzahl der Monate zählen und sich das erste und letzte Datum ansehen, um zu sehen, ob wie viele Monate, die sich erstrecken.

Wenn Ihre Tabelle eine Spalte namens month hat (seit date ist nicht erlaubt, es sei denn, es handelt sich um einen Bezeichner in Anführungszeichen), könnten Sie beginnen mit:

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

Vergleichen Sie dann die Zählung mit der Monatsspanne in einem having Klausel:

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

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

Wenn Sie tatsächlich mehrere Datensätze in einem Monat für eine ID haben können und/oder das aufgezeichnete Datum möglicherweise nicht der Beginn des Monats ist, können Sie etwas mehr Arbeit leisten, um die Daten zu normalisieren:

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;