Oracle
 sql >> база данни >  >> RDS >> Oracle

Намиране на липсващи дати в последователност

За да получите прост списък с идентификационни номера с пропуски, без допълнителни подробности, трябва да разгледате всеки идентификационен номер поотделно и както предложи @mikey, можете да преброите броя на месеците и да погледнете първата и последната дата, за да видите дали колко месеци, които обхващат.

Ако вашата таблица има колона, наречена month (от date не е разрешено, освен ако не е идентификатор в кавички), можете да започнете с:

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

След това сравнете броя с месечния период в having клауза:

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

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

Ако действително можете да имате няколко записа в един месец за ID и/или записаната дата може да не е началото на месеца, можете да направите малко повече работа, за да нормализирате датите:

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. Инструментариум:Прехвърляне на org.apache.tomcat.dbcp.dbcp.PoolingDataSource$PoolGuardConnectionWrapper към oracle.jdbc.OracleConnection

  2. Oracle Trigger на вложена таблица

  3. искат да показват положителни и отрицателни стойности в различни колони чрез една заявка

  4. ORA-01882:регионът на часовата зона не е намерен в Entity Framework

  5. Не може да се разбере как стойността се преобразува имплицитно във формат на дата