Nous utilisons des cookies pour vous garantir la meilleure expérience sur notre site. Si vous continuez à utiliser ce dernier, nous considèrerons que vous acceptez l'utilisation des cookies. J'ai compris ! ou En savoir plus !.
banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

#1 Mon 20 March 2023 16:37

mstcx
Participant actif
Lieu: Nîmes
Date d'inscription: 21 Feb 2008
Messages: 87

Créer un identifiant = num_insee + incrément

Bonjour,

Je souhaiterai crée un identifiant qui concaténerai le champ n° Insee de commune (5c) + un n° incrémental automatique.
exemple :

01001 1
...
01001 20
01002 1
...
01002 150
etc.


J'ai idée qu'il me faut créer une séquence, mais je ne sais pas comment la remettre à zéro (à 1) pour chaque nouveau n° insee de commune.
En vous remerciant pour votre aide.

Marc

Hors ligne

 

#2 Mon 20 March 2023 19:17

p.jeremie
Participant assidu
Lieu: Valence
Date d'inscription: 10 Sep 2017
Messages: 426

Re: Créer un identifiant = num_insee + incrément

Bonjour,

Je ne sais pas pour quel besoin vous voulez faire ça mais ce n'est pas forcément une bonne idée.
Dès que des communes vont fusionner vous serez contraints de modifier vos identifiant.
Il est préférable d'avoir un identifiant décorrelé des attributs. Un compteur tout simple par exemple.

Hors ligne

 

#3 Tue 21 March 2023 09:26

Nicolas Ribot
Membre
Lieu: Toulouse
Date d'inscription: 9 Sep 2005
Messages: 1542

Re: Créer un identifiant = num_insee + incrément

Bonjour,
assez d'accord avec p.jeremie sur les id.

Pas besoin de séquence pour faire cela, utilisez plutot les windows functions (un peu complexe à appréhender, mais super puissant pour traiter/analyse les données: https://www.postgresql.org/docs/15/tuto … dow.html).

Ca permet de définir des groupes, comme group by, mais en gardant toutes les lignes dans le select (ce que ne permet pas le group by)

Code:

with tmp as (
    select * from (
    values ('10001'),
           ('10001'),
           ('10002'),
           ('10002'),
           ('10004'),
           ('10004'),
           ('10004'),
           ('10004'),
           ('10005'),
           ('10005'),
           ('10005')) as v(insee)
) select insee, row_number() over w as idx,
         format('%s_%s', insee, row_number() over w) as newid
from tmp
window w as (partition by insee);

10001|1|10001_1
10001|2|10001_2
10002|1|10002_1
10002|2|10002_2
10004|1|10004_1
10004|2|10004_2
10004|3|10004_3
10004|4|10004_4
10005|1|10005_1
10005|2|10005_2
10005|3|10005_3

Là, comme la partition est utilisée deux fois dans le select, elle est mise à la fin de la requête pour ne la défnir qu'une fois. row_number() est une des windows functions disponibles.

Nicolas

Dernière modification par Nicolas Ribot (Tue 21 March 2023 09:28)

Hors ligne

 

#4 Wed 22 March 2023 16:01

mstcx
Participant actif
Lieu: Nîmes
Date d'inscription: 21 Feb 2008
Messages: 87

Re: Créer un identifiant = num_insee + incrément

p.jeremie a écrit:

Dès que des communes vont fusionner vous serez contraints de modifier vos identifiant.
Il est préférable d'avoir un identifiant décorrelé des attributs. Un compteur tout simple par exemple.


Ouiap, effectivement !
Merci pour cet éclairage et vos réponses (NR + PJ).

Hors ligne

 

Pied de page des forums

Powered by FluxBB