sql >> Database teknologi >  >> RDS >> Oracle

Hvordan man vælger områder i en række rekorder i Oracle

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 .



  1. bundle exec rake assets:precompile - databasekonfiguration specificerer ikke adapter

  2. Datarammeskrivning til Postgresql dårlig ydeevne

  3. Hvordan ser man CREATE VIEW-koden for en visning i PostgreSQL?

  4. Er der nogen forskel mellem varchar(10) og varchar(1000), når vi gemmer streng, hvis længde er mindre end 10?