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

Finde manglende datoer i en rækkefølge

For at få en simpel liste over ID'erne med huller uden yderligere detaljer, skal du se på hvert ID separat, og som @mikey foreslog, kan du tælle antallet af måneder og se på den første og sidste dato for at se, om hvor mange måneder, der strækker sig.

Hvis din tabel har en kolonne kaldet month (siden date er ikke tilladt, medmindre det er en citeret identifikator), kan du starte 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

Sammenlign derefter antallet med månedsspændet 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

Hvis du faktisk kan have flere registreringer på en måned for et ID, og/eller datoen for optagelsen måske ikke er starten på måneden, kan du gøre lidt mere arbejde for at normalisere datoerne:

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;


  1. Kan ikke forbinde en DB til AWS

  2. Finde andelen af ​​hvert X bestående af Y i PostgreSQL?

  3. FUNCTION syntaksfejl

  4. Fejl Mens der oprettes forbindelse til Oracle, kender TNS:listener i øjeblikket ikke til den tjeneste, der er anmodet om i forbindelsesbeskrivelsen