sql >> Databáze >  >> RDS >> Oracle

Hledání chybějících dat v sekvenci

Chcete-li získat jednoduchý seznam ID s mezerami, bez dalších podrobností, musíte se podívat na každé ID zvlášť, a jak navrhl @mikey, můžete si spočítat počet měsíců a podívat se na první a poslední datum, abyste zjistili, kolik měsíců.

Pokud vaše tabulka obsahuje sloupec s názvem month (od date není povoleno, pokud se nejedná o identifikátor v uvozovkách), můžete začít:

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

Poté porovnejte počet s rozpětím měsíce v having klauzule:

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

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

Pokud skutečně můžete mít pro ID více záznamů za měsíc a/nebo zaznamenané datum nemusí být začátkem měsíce, můžete udělat trochu více práce s normalizací dat:

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. Importujte soubory .frm a .opt do MySQL

  2. Velikost tabulky s rozložením stránky

  3. jak vložit více hodnot do jednoho pole v mysql

  4. Jak mohu vytvořit kopii tabulky Oracle bez kopírování dat?