ギャップのあるIDの簡単なリストを取得するには、詳細を追加せずに、各IDを個別に確認する必要があります。@ 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;