sql >> Databasteknik >  >> RDS >> Oracle

Oracle Partitioned Sequence

Är det faktiska kravet att den sekundära sekvensen ska vara gapfri? I så fall har du ett jätteproblem med serialisering/skalbarhet.

Om du behöver presentera en gapfri sekvens för mänsklig konsumtion kan du använda en faktisk sekvens (eller en tidsstämpel, för den delen) som Nick Pierpont föreslår och bevara skalbarheten, du kan använda analytiska funktioner.

Datauppsättning (t1):

 ID_PERSON SEQUENCE_ID
---------- -----------
         1           1
         2           2
         3           3
         1           4
         1           5
         1           6
         2           7
         3           8
         1           9

SQL:

select * 
  from 
  (select id_person, 
          sequence_id as orig_sequence_id,         
          rank () 
            over (partition by id_person 
                  order by sequence_id) 
            as new_sequence_id
     from t1
  )
 order by id_person, new_sequence_id;

Resultat:

ID_PERSON  ORIG_SEQUENCE_ID NEW_SEQUENCE_ID
---------- ---------------- ---------------
         1                1               1
         1                4               2
         1                5               3
         1                6               4
         1                9               5
         2                2               1
         2                7               2
         3                3               1
         3                8               2


  1. Insamlingsmetod:DELETE-procedur i Oracle Database

  2. Bindning av parametrar till Oracle Dynamic SQL

  3. Fråga flera NEXTVAL från sekvensen i en sats

  4. Hitta icke-ASCII-tecken i varchar-kolumner med SQL Server