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;