Ordinamento delle colonne Oracle Alpha-Numeric
Sto lavorando per ordinare la colonna Revision di una tabella Oracle DB nell'ordine asc come di seguito. Dapprima le revisioni numeriche da ordinare (1,2,3,…). Successivamente Alfa-Numerico da ordinare come segue: A, B, B1, C, C1, C2,…,Y, Y2, Y3, Z, AA, AB,..,DA, …ZZ, ecc. Row_Number() in l'istruzione SELECT da compilare con 1,2,3... per ogni numero di documento (ABC, XYZ) dopo l'ordinamento delle revisioni.
Vedere l'immagine caricata per la tabella richiesta.
Ho provato con SUBSTR , Ordina per, ecc. ma non sono riuscito a risolvere i requisiti di cui sopra. Qualcuno può aiutarmi su questo? Grazie!

Risposte
A quanto ho capito la tua domanda, vuoi inserire le ultime revisioni che contengono solo due caratteri e nessuna cifra.
Puoi usare un ordinamento condizionale:
select
t.*,
row_number() over(
partition by doc#
order by
case when regexp_like(revision, '^\w\d?$') then 0 else 1 end,
revision
) rn
from t
order by doc#, rn
L'espressione regolare descrive una stringa che inizia con un carattere alfanumerico, eventualmente seguito da una cifra: queste revisioni dovrebbero venire prima. Demo su DB Fiddle :
with t as (
select 'ABC' doc#, '1' revision from dual
union all select 'ABC', '2' from dual
union all select 'ABC', '3' from dual
union all select 'ABC', 'A' from dual
union all select 'ABC', 'B' from dual
union all select 'ABC', 'B1' from dual
union all select 'ABC', 'C' from dual
union all select 'ABC', 'C1' from dual
union all select 'ABC', 'D' from dual
union all select 'ABC', 'AA' from dual
union all select 'ABC', 'AB' from dual
union all select 'ABC', 'BA' from dual
union all select 'ABC', 'DA' from dual
)
select
t.*,
row_number() over(
partition by doc#
order by
case when regexp_like(revision, '^\w\d?$') then 0 else 1 end,
revision
) rn
from t
order by doc#, rn
DOC# | REVISIONE | RN :--- | :------- | -: ABC | 1 | 1 ABC | 2 | 2 ABC | 3 | 3 ABC | UN | 4 ABC | B | 5 ABC | B1 | 6 ABC | C | 7 ABC | DO1 | 8 ABC | D | 9 ABC | AA| 10 ABC | AB | 11 ABC | BA | 12 ABC | DA | 13
Esiste un vecchio metodo ben noto: rpad(col, max-length, '0')
Ad esempio rpad(col, max(length(col)) over(), '0'