Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Znajdowanie brakujących dat w sekwencji

Aby uzyskać prostą listę identyfikatorów z przerwami, bez dalszych szczegółów, musisz spojrzeć na każdy identyfikator osobno, a jak zasugerował @mikey, możesz policzyć liczbę miesięcy i spojrzeć na pierwszą i ostatnią datę, aby zobaczyć, ile miesięcy, które obejmują.

Jeśli Twoja tabela ma kolumnę o nazwie month (od date nie jest dozwolone, chyba że jest to identyfikator w cudzysłowie), możesz zacząć od:

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

Następnie porównaj liczbę z okresem miesiąca, w having klauzula:

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

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

Jeśli faktycznie możesz mieć wiele rekordów w miesiącu dla dowodu tożsamości i/lub data zarejestrowania może nie być początkiem miesiąca, możesz wykonać trochę więcej pracy, aby znormalizować daty:

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Dlaczego funkcje agregujące nie są dozwolone w klauzuli where?

  2. Jaka jest różnica między ORA-12571:Awaria zapisu pakietów TNS a ORA-03135:Utracono połączenie?

  3. Metadane funkcji wbudowanych Oracle

  4. Uruchamianie przykładowej aplikacji RMI

  5. Kerberos w połączeniu zarządzanym w języku C# Oracle