sql >> Database >  >> RDS >> Oracle

Ontbrekende datums in een reeks zoeken

Om een ​​eenvoudige lijst te krijgen van de ID's met hiaten, zonder verdere details, moet u elke ID afzonderlijk bekijken, en zoals @mikey suggereerde, kunt u het aantal maanden tellen en naar de eerste en laatste datum kijken om te zien hoeveel maanden die overspant.

Als uw tabel een kolom heeft met de naam month (sinds date is niet toegestaan ​​tenzij het een identificatie tussen aanhalingstekens is) waarmee u zou kunnen beginnen:

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

Vergelijk vervolgens de telling met de maandspanne, in een having clausule:

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

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

Als u meerdere records in een maand kunt hebben voor een ID, en/of de geregistreerde datum is misschien niet het begin van de maand, dan kunt u wat meer werk doen om de datums te normaliseren:

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. Waarom blijft deze MySQL-query hangen?

  2. Stel automatisch mysql autoincrement in op min waarde

  3. MySQL LIKE werkt niet met â

  4. Neo4j-browser