För att få en enkel lista över ID:n med luckor, utan ytterligare detaljer, måste du titta på varje ID separat, och som @mikey föreslog kan du räkna antalet månader och titta på det första och sista datumet för att se om hur många månader som sträcker sig.
Om din tabell har en kolumn som heter month
(sedan date
är inte tillåtet om det inte är en citerad identifierare) kan du börja med:
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
Jämför sedan antalet med månadsintervallet, i en having
klausul:
select id
from your_table
group by id
having count(month) != months_between(max(month), min(month)) + 1
order by id;
ID
----------
123
456
Om du faktiskt kan ha flera poster under en månad för ett ID och/eller det registrerade datumet kanske inte är början på månaden, kan du göra lite mer arbete för att normalisera datumen:
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;