За да получите прост списък с идентификационни номера с пропуски, без допълнителни подробности, трябва да разгледате всеки идентификационен номер поотделно и както предложи @mikey, можете да преброите броя на месеците и да погледнете първата и последната дата, за да видите дали колко месеци, които обхващат.
Ако вашата таблица има колона, наречена month
(от date
не е разрешено, освен ако не е идентификатор в кавички), можете да започнете с:
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
След това сравнете броя с месечния период в having
клауза:
select id
from your_table
group by id
having count(month) != months_between(max(month), min(month)) + 1
order by id;
ID
----------
123
456
Ако действително можете да имате няколко записа в един месец за ID и/или записаната дата може да не е началото на месеца, можете да направите малко повече работа, за да нормализирате датите:
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;