sql >> Databasteknik >  >> RDS >> Oracle

Hitta saknade datum i en sekvens

För att få en enkel lista över ID:n med luckor, utan ytterligare detaljer, måste du titta på varje ID separat, och som @mikey föreslog kan du räkna antalet månader och titta på det första och sista datumet för att se om hur många månader som sträcker sig.

Om din tabell har en kolumn som heter month (sedan date är inte tillåtet om det inte är en citerad identifierare) kan du börja 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

Jämför sedan antalet med månadsintervallet, 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

Om du faktiskt kan ha flera poster under en månad för ett ID och/eller det registrerade datumet kanske inte är början på månaden, kan du göra lite mer arbete för att normalisera datumen:

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. PostgreSQL:Hur ställer jag in sökvägen på användarnivå?

  2. Google App Script JDBC/MySql:du är inte ägare till trådfelet

  3. Hämtar data från två tabeller första tabell textdata andra tabell mediabilder. bilderna misslyckas

  4. Introduktion till PL/SQL Bulk Collect i Oracle Database