sql >> Base de Datos >  >> RDS >> Oracle

Encontrar fechas faltantes en una secuencia

Para obtener una lista simple de las identificaciones con lagunas, sin más detalles, debe mirar cada identificación por separado y, como sugirió @mikey, puede contar la cantidad de meses y mirar la primera y la última fecha para ver cuántos. meses que abarca.

Si su tabla tiene una columna llamada month (desde date no está permitido a menos que sea un identificador entre comillas) podría comenzar 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

Luego compare el conteo con el lapso de meses, en un having cláusula:

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

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

Si realmente puede tener varios registros en un mes para una identificación, y/o la fecha registrada podría no ser el comienzo del mes, puede trabajar un poco más para normalizar las fechas:

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;