Oracle
 sql >> Base de données >  >> RDS >> Oracle

Séquence partitionnée Oracle

L'exigence réelle est-elle que la séquence secondaire soit sans espace? Si c'est le cas, vous avez un énorme problème de sérialisation/évolutivité.

Si vous avez besoin de présenter une séquence sans interruption pour la consommation humaine, vous pouvez utiliser une séquence réelle (ou un horodatage, d'ailleurs) comme le suggère Nick Pierpont et préserver l'évolutivité, vous pouvez utiliser des fonctions analytiques.

Jeu de données (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;

Résultat :

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