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é ?

Annonce

Rencontres QGIS 2025

L'appel à participation est ouvert jusqu'au 19 janvier 2025!

#1 Mon 23 July 2018 15:28

bruhnild
Participant actif
Lieu: Lyon
Date d'inscription: 7 Jun 2014
Messages: 130

Création de séquence qui boucle sur chaque valeur différente[postgres]

Bonjour à toutes et à tous,

J'aimerais pouvoir incrémenter une séquence à 5 chiffres qui redémarre à 1 à chaque nouvelle valeur de sro.

Pour le moment ma séquence s'incrémente bien de 1 à 99999 mais sans tenir compte des différentes valeurs de sro (il y en a 138)

Voici ma séquence:

Code:

DROP SEQUENCE IF EXISTS gracethd_metis.t_noeud_incrementation_nd_code;
CREATE SEQUENCE gracethd_metis.t_noeud_incrementation_nd_code
  INCREMENT 1
  MINVALUE 00000
  MAXVALUE 99999
  START 1
  CACHE 1;
ALTER TABLE gracethd_metis.t_noeud OWNER TO postgres;

Et voici mon with :

Code:

WITH vue_metier AS    
(    SELECT
          concat(digt_6, digt_7, digt_8, digt_9) as sro
        ,'SF' as nb_type
    FROM rbal.bal_hsn_point_2154 a
    LEFT JOIN psd_orange.ref_code_zasro b ON a.nom_sro=b.code_sro_definitif)
    SELECT 
    concat('ND700',sro , to_char(nextval('gracethd.t_noeud_incrementation_nd_code'), 'FM00000')) as nd_code,
    sro, 
    nb_type,    
    FROM vue_metier

Dans le principe je pense qu'il faudrait utiliser une boucle for, le problème est que je ne vois pas comment l'utiliser ensuite dans mon concat..

Code:

create or replace function fetcher (n integer)
returns void as $$
declare
sro record;
begin
for sro in 
select cd_sro 
from 
(with code_sro as (select concat(digt_6, digt_7, digt_8, digt_9) as cd_sro 
from psd_orange.ref_code_zasro)
select cd_sro from code_sro)a
limit n
loop
raise notice '%', sro.cd_sro;
end loop;
end;
$$language plpgsql;

Auriez vous des pistes à ce sujet?

Merci d'avance pour vos contributions!

Marine.

Dernière modification par bruhnild (Mon 23 July 2018 15:29)


Fichier(s) joint(s) :
Pour accéder aux fichiers vous devez vous inscrire.

Hors ligne

 

#2 Mon 23 July 2018 15:48

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

Re: Création de séquence qui boucle sur chaque valeur différente[postgres]

Bonjour,

Utilisez une windows function pour cela, comme row_number(), qui vous permet de donner un numéro de lignes a un ensemble de valeurs:

row_number() over (partition by sro order by ...)

Nicolas

Hors ligne

 

#3 Thu 26 July 2018 17:09

bruhnild
Participant actif
Lieu: Lyon
Date d'inscription: 7 Jun 2014
Messages: 130

Re: Création de séquence qui boucle sur chaque valeur différente[postgres]

Bonjour, merci pour l'idée, ça fonctionne!

Code:

WITH vue_metier AS    
(    SELECT
          concat(b.digt_6, b.digt_7, b.digt_8, digt_9) as sro
        ,'SF' as nb_type
    FROM rbal.bal_hsn_point_2154 a, psd_orange.zasro_hsn_polygon_2154 b 
    WHERE ST_CONTAINS (b.geom, a.geom))
    SELECT 
    row_number() over (partition by sro ) as id
   ,concat('ND700',sro , to_char(row_number() over (partition by sro ), 'FM00000')) as nd_code
    ,sro
   ,nb_type 
    FROM vue_metier

Dernière modification par bruhnild (Thu 26 July 2018 17:10)


Fichier(s) joint(s) :
Pour accéder aux fichiers vous devez vous inscrire.

Hors ligne

 

Pied de page des forums

Powered by FluxBB