Dette er en fin måde, fancy navn "Tabibitosan-metoden " givet af Aketi Jyuuzou.
SQL> MED data SOM 2 (VÆLG NUM - DENSE_RANK() OVER(OPDELING EFTER status ORDER BY num) grp, 3 status, 4 num 5 FRA t 6 ) 7 SELECT MIN(num) 8 ||' - ' 9 || MAX(antal) område, 10 COUNT(*) cnt 11 FRA data 12 WHERE status='A' 13 GRUPPER EFTER grp 14 BESTIL EFTER grp 15 /RANGE CNT------ ---------- 1 - 3 36 - 6 19 - 10 2SQL>
Bemærk Det er bedre at bruge DENSE_RANK
for at undgå dubletter.
Tabel
SQL> VÆLG * FRA t BESTIL EFTER num; NUM S---------- - 1 A 1 A 2 A 2 A 3 A 4 U 5 U 6 A 7 U 8 U 9 A NUM S---------- - 10 A12 rækker valgt.
Der er dubletter for num =1.
Bruger DENSE_RANK :
SQL> MED data SOM 2 (VÆLG NUM - DENSE_RANK() OVER(OPDELING EFTER status ORDER BY num) grp, 3 status, 4 num 5 FRA t 6 ) 7 SELECT MIN(num) 8 ||' - ' 9 || MAX(antal) område, 10 COUNT(*) cnt 11 FRA data 12 WHERE status='A' 13 GRUPPER EFTER grp 14 BESTIL EFTER grp 15 /RANGE CNT------ ---------- 1 - 3 56 - 6 19 - 10 2SQL>
Bruger ROW_NUMBER :
SQL> MED DATA SOM 2 (VÆLG NUM - ROW_NUMBER() OVER(OPDELING EFTER status ORDER BY num) grp, 3 status, 4 num 5 FRA t 6 ) 7 VÆLG MIN(num) 8 ||' - ' 9 || MAX(antal) område, 10 COUNT(*) cnt 11 FRA data 12 WHERE status='A' 13 GRUPPER EFTER grp 14 BESTIL EFTER grp 15 /RANGE CNT------ ---------- 2 - 3 21 - 2 21 - 6 29 - 10 2SQL>
Så i tilfælde af dubletter, ROW_NUMBER forespørgsel ville give forkerte resultater. Du bør bruge DENSE_RANK .