Du kan göra det med ROW_NUMBER analytisk funktion. Se Hitta intervall av på varandra följande värden i en sekvens av siffror eller datum .
Till exempel
Räckvidd
SQL> med data(num) som( 2 välj 1 från dubbel union 3 välj 2 från dubbel union 4 välj 3 från dubbel union 5 välj 5 från dubbel union 6 välj 6 från dubbel union 7 välj 7 från dubbel union union 8 välj 10 från dubbel union 9 välj 11 från dubbel union 10 välj 12 från dubbel union 11 välj 20 från dubbel 12 ) 13 välj min(num)||'-'|| max(antal) som "intervall" 14 från (välj num, 15 num-Rad_Number() över(ordning efter antal) 16 som rn 17 från data) 18 gruppera efter rn 19 ordna efter min(antal);intervall---- --------------------------------------------1-35-710 -1220-20SQL>
Lista
SQL> med data(num) som( 2 välj 1 från dubbel union 3 välj 2 från dubbel union 4 välj 3 från dubbel union 5 välj 5 från dubbel union 6 välj 6 från dubbel union 7 välj 7 från dubbel union union 8 välj 10 från dual union 9 välj 11 från dual union 10 välj 12 från dual union 11 välj 20 från dual 12 ) 13 SELECT listagg(intervall, ',') INOM GRUPP( 14 ORDER BY min_num) SOM "lista" 15 FRÅN 16 (VÄLJ MIN(tal) min_num, 17 MIN(tal) 18 ||'-' 19 || MAX(antal) område 20 FRÅN 21 (VÄLJ num, num-Rad_Number() över(ordning efter num) AS rn FROM DATA 22 ) 23 GROUP BY rn 24 );lista---------------------------------------- ----------------------------------1-3,5-7,10-12,20-20SQL>
Uppdatera OP vill ha en lösning i PL/SQL för att lagra listan i en PL/SQL-variabel.
Inställningar
S FRÅN dual 12 UNION 13 VÄLJ 6 FRÅN dual 14 UNION 15 VÄLJ 7 FRÅN dubbel 16 UNION 17 VÄLJ 10 FRÅN dubbel 18 UNION 19 VÄLJ 11 FRÅN dubbel 20 UNION 21 VÄLJ 12 FRÅN dubbel 22 UNION 23) VÄLJ FRÅN DATA); Tabell skapad.PL/SQL-block
SQL> SET SERVEROUTPUT ONSQL> DECLARE 2 v_list VARCHAR2(100); 3 BÖRJA 4 VÄLJ listagg(OMRÅDE, ',') INOM GRUPP( 5 ORDER BY min_num) 6 INTO v_list 7 FROM 8 (SELECT MIN(num) min_num, 9 MIN(num) 10 ||'-' 11 || MAX( num) range 12 FROM 13 (SELECT num, num-Row_Number() over(ordning efter num) AS rn FROM t 14 ) 15 GROUP BY rn 16 ); 17 dbms_output.put_line(v_list); 18 SLUT; 19 /1-3,5-7,10-12,20-20PL/SQL-proceduren har slutförts.SQL>