sql >> Databasteknik >  >> RDS >> Oracle

Hitta intervall från en serie tal i SQL/Oracle

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> 


  1. Hur pivoterar man? Hur konverterar man flera rader till en rad med flera kolumner?

  2. Android SQLite stängt undantag

  3. Algoritm som söker efter relaterade objekt baserat på vanliga taggar

  4. förberedd sats där värdet är i array