Oracle
 sql >> Database >  >> RDS >> Oracle

Trovare le date mancanti in una sequenza

Per ottenere un semplice elenco degli ID con spazi vuoti, senza ulteriori dettagli, è necessario guardare ciascun ID separatamente e, come suggerito da @mikey, è possibile contare il numero di mesi e guardare la prima e l'ultima data per vedere se quanti mesi che durano.

Se la tua tabella ha una colonna chiamata month (dal date non è consentito a meno che non sia un identificatore tra virgolette) potresti iniziare con:

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

Quindi confronta il conteggio con l'intervallo del mese, in un having clausola:

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

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

Se puoi effettivamente avere più record in un mese per un ID e/o la data registrata potrebbe non essere l'inizio del mese, puoi fare un po' più di lavoro per normalizzare le date:

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;