/ / Implementácia dočasného dotazu na databázu Oracle - dátumy dátumov kolapsu - sql, Oracle, plsql, temporal-database

Oracle Database Temporal Query Implementation - Zbaliť dátumové rozsahy - sql, oracle, plsql, temporal-database

Toto je výsledok jedného z mojich dotazov:

SURGERY_D
---------
01-APR-05
02-APR-05
03-APR-05
04-APR-05
05-APR-05
06-APR-05
07-APR-05

11-APR-05
12-APR-05
13-APR-05
14-APR-05
15-APR-05
16-APR-05

19-APR-05
20-APR-05
21-APR-05
22-APR-05
23-APR-05
24-APR-05

26-APR-05
27-APR-05
28-APR-05
29-APR-05
30-APR-05

Chcem zbaliť časové obdobia, ktoré sú súvislé, do intervalov. Pre príklady

[01-APR-05, 07-APR-05], [11-APR-05, 16-APR-05] and so on.

Z hľadiska časových databáz by som chcel„zbaliť“ dátumy. Máte nejaký nápad, ako to urobiť na Oracle? Používam verziu 11. Vyhľadal som ju a prečítal som si knihu, ale nemohol som nájsť / pochopiť, ako to urobiť. Môže to byť jednoduché, ale každý má svoje vlastné chyby a Oracle je môj. Tiež som v SO nováčikom, takže ospravedlňujem sa, ak som porušil nejaké pravidlá. Ďakujem!

odpovede:

6 pre odpoveď č. 1

Môžete využiť ROW_NUMBER analytická funkcia na vygenerovanie jedinečného poradového čísla pre každý zo záznamov (toto číslo priradíme dátumom vo vzostupnom poradí).

Potom zoskupíte dátumy podľa rozdielu medzi dátumom a vygenerovaným číslom - po sebe nasledujúce dátumy budú mať rovnaký rozdiel:

Rozdiel v čísle dátumu 01-APR-051 1 - MIN (date_val) v skupine s rozdiel. = 1 02-APR-05 2 1 03-APR-05 3 1 04-APR-05 4 1 05-APR-05 5 1 06-APR-05 6 1 07-APR-05 7 1 - MAX (date_val) v skupine s rozdielom = 1 11-APR-05 8 3 - MIN (date_val) v skupine s rozdielom = 3 12-APR-05 9 3 13-APR-05 10 3 14-APR-05 11 3 15-APR-05 12 3 16-APR-05 13 3 - MAX (date_val) v skupine s rozdielom = 3

Nakoniec v každej zo skupín vyberiete minimálny a maximálny dátum, aby ste získali začiatok a koniec každého rozsahu.

Tu je dotaz:

SELECT
MIN(date_val) start_date,
MAX(date_val) end_date
FROM (
SELECT
date_val,
row_number() OVER (ORDER BY date_val) AS rn
FROM date_tab
)
GROUP BY date_val - rn
ORDER BY 1
;

Výkon:

START_DATE END_DATE ------------ ---------- 01-04-2005 07-04-2005 04-04-2005 16-04-2005 19-04-2005 24-04-2005 26-04-2005 30-04-2005

Môžete skontrolovať, ako to funguje na SQLFidlle: Príklad rozsahov dátumov