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 Tue 14 November 2017 13:12

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

Selection de valeur en fonction de la longueur max

Bonjour,

Je cherche à obtenir dans une table une valeur unique (champs prev_starr) en fonction de la longueur maximale parmi toutes les entités contenues dans la table.
Exemple, pour 3 valeurs de prev_starr :

Aerien BT - longueur 3688
Aerien BT - longueur 5844
Gc a creer - longueur 2036

J'aimerais sélectionner cette valeur : Aerien BT - longueur 5844
(Voir en PJ la capture d'écran)

Pourriez vous m'aider à trouver une syntaxe postgres sql pour réaliser cette opération?

Merci d'avance!

Dernière modification par bruhnild (Tue 14 November 2017 13:54)

Hors ligne

 

#2 Tue 14 November 2017 13:50

Pascal Boulerie
Participant assidu
Lieu: France
Date d'inscription: 12 Sep 2005
Messages: 2947
Site web

Re: Selection de valeur en fonction de la longueur max

Les fichiers de pièce jointe ne sont pas visibles ici sur le forum...
https://georezo.net/forum/viewtopic.php … 72#p301872


« L'État est désormais quasi déliquescent. » (José Cohen-Aknine, ingénieur X-Ponts, IGPEF, dans Déliquescence et renaissance de l'État.)

Hors ligne

 

#3 Tue 14 November 2017 13:54

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

Re: Selection de valeur en fonction de la longueur max

Malheureusement je n'arrive pas à charger mon image. J'espère que mes explications seules suffisent..

Hors ligne

 

#4 Tue 14 November 2017 14:03

Sylvain M.
Participant assidu
Lieu: Saint-Pierre-des-Nids (53)
Date d'inscription: 8 Sep 2005
Messages: 995

Re: Selection de valeur en fonction de la longueur max

Le champ "prev_starr" contient-il l'ensemble des infos (texte et numérique) ?
Ou bien y a-t-il un champ "prev_starr", type texte, avec ["Aerien BT","Gc a creer", ...] comme valeurs, et un champ "longueur", numérique, avec les valeurs de longueur ?
C'est plus simple dans ce deuxième cas de figure :

Code:

SELECT prev_starr
FROM ta_table
ORDER BY longueur DESC
LIMIT 1

Sylvain M.

Hors ligne

 

#5 Tue 14 November 2017 14:20

jmarsac
Participant assidu
Lieu: NICE
Date d'inscription: 26 Oct 2005
Messages: 572
Site web

Re: Selection de valeur en fonction de la longueur max

Sylvain M. a écrit:

Le champ "prev_starr" contient-il l'ensemble des infos (texte et numérique) ?
Ou bien y a-t-il un champ "prev_starr", type texte, avec ["Aerien BT","Gc a creer", ...] comme valeurs, et un champ "longueur", numérique, avec les valeurs de longueur ?
C'est plus simple dans ce deuxième cas de figure :

Code:

SELECT prev_starr
FROM ta_table
ORDER BY longueur DESC
LIMIT 1


Pour le premier cas de figure :

Code:

SELECT prev_starr , to_number(substring( prev_starr from '[0-9]+'),'99999999') AS longueur 
  FROM t1
  ORDER BY longueur DESC
  LIMIT 1;

Jean-Marie
Azimut

Hors ligne

 

#6 Tue 14 November 2017 14:20

Sylvain M.
Participant assidu
Lieu: Saint-Pierre-des-Nids (53)
Date d'inscription: 8 Sep 2005
Messages: 995

Re: Selection de valeur en fonction de la longueur max

Et si jamais il y avait plusieurs valeurs de "prev_starr" avec la même longueur, voici une requête qui récupère l'ensemble des valeurs :

Code:

WITH max AS (SELECT max(longueur) as longueur FROM ta_table)
SELECT prev_starr
  FROM ta_table,
  max
  WHERE longueur = max.longueur;

Sylvain M.

Hors ligne

 

#7 Tue 14 November 2017 14:27

ChristopheV
Membre
Lieu: Ajaccio
Date d'inscription: 7 Sep 2005
Messages: 3199
Site web

Re: Selection de valeur en fonction de la longueur max

Bonjour,

SELECT MAX(to_number( prev_starr,'999999') FROM monschema.matable


Voyez la fonction to_number(,) pour l'explication de formatage.


Christophe
L'avantage d'être une île c'est d'être une terre topologiquement close

Hors ligne

 

#8 Tue 14 November 2017 15:34

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

Re: Selection de valeur en fonction de la longueur max

Merci pour vos propositions de requêtes, c'est plus que je n'en espérais!
Je suis bien parvenu  à afficher mon résultat!
Sylvain M, le deuxième cas de figure (plus simple) était effectivement le bon!

Bonne journée!

Hors ligne

 

#9 Mon 20 November 2017 10:34

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

Re: Selection de valeur en fonction de la longueur max

Bonjour à tous,

J'essaye d'afficher les valeurs de deux with (prev_starr et longueur) imbriqués dans une requete.

Je m'explique, j'ai le même nombre de lignes (19) dans les deux résultats de with et ils fonctionnent bien séparément mais dès lors que j'essaye de les mettre ensemble dans une même requete j'obtient l'erreur suivante :

ERREUR:  plus d'une ligne renvoyée par une sous-requête utilisée comme une expression

Voici mon code:



Code:

SELECT 
  (WITH prev_starr AS (
    SELECT prev_starr FROM 
        (WITH max AS 
            (SELECT id_opp, max(longueur) AS longueur FROM  coordination.opportunite GROUP BY id_opp)
        SELECT DISTINCT ON (max.id_opp) max.id_opp, prev_starr,  max.longueur
        FROM coordination.opportunite o,max
        WHERE o.longueur = max.longueur
        ORDER BY id_opp)first_with)
  SELECT prev_starr AS prev_starr
  FROM prev_starr) prev_starr,

  (WITH longueur AS (
    SELECT longueur_max FROM 
        (WITH sum AS 
            (SELECT id_opp, sum(longueur) as longueur_max FROM coordination.opportunite group by id_opp)
        SELECT distinct on (sum.id_opp) sum.id_opp, sum.longueur_max
    FROM coordination.opportunite o, sum)first_with)
   SELECT longueur_max as longueur
   FROM longueur) longueur
   FROM coordination.opportunite

Auriez vous une idée pour me débloquer..?

Merci d'avance pour votre aide précieuse!

Marine.

Hors ligne

 

#10 Mon 20 November 2017 11:05

tumasgiu
Membre
Lieu: Ajaccio
Date d'inscription: 5 Jul 2010
Messages: 1160

Re: Selection de valeur en fonction de la longueur max

Salut,

le message est clair, au moins une de vos sous expressions
renvoie plus d'une ligne :

Voici un exemple plus parlant :

Code:

--renvoie le même code erreur
select (select 1 UNION select 2)

Vous pouvez rajouter un LIMIT 1 ORDER BY longueur/prev_star DESC a la fin de chaque sous expression,
mais je ne suis pas sur que vous obtiendrez le résultat voulu.

Si j'ai bien compris vous pouvez peut être simplifier votre requête comme ceci:

Code:

SELECT max(longueur), sum(longueur) FROM coordination.opportunite

Dernière modification par tumasgiu (Mon 20 November 2017 11:10)

Hors ligne

 

#11 Mon 20 November 2017 11:14

ChristopheV
Membre
Lieu: Ajaccio
Date d'inscription: 7 Sep 2005
Messages: 3199
Site web

Re: Selection de valeur en fonction de la longueur max

Bonjour,

Votre syntaxe est pour moi étrange et peu lisible. Imbriquer des CTE et des sous-requêtes ....  ?

Code:

WITH p1 AS (SELECT id_opp, sum(longueur) as longueur_max FROM coordination.opportunite group by id_opp)

Premièrement évitez les mots clefs pour référencer une CTE (sum inapproprié).

Ensuite je ne comprends pas le : "FROM coordination.opportunite, sum" la jointure elle ce fait comment et pour récupérer quoi ?
il y a pas un JOIN ON p1.id_opp=p2.id_opp ?

Bref pas très clair pour moi.

p2 as (SELECT distinct id_opp,longueur_max FROM p1)


Christophe
L'avantage d'être une île c'est d'être une terre topologiquement close

Hors ligne

 

Pied de page des forums

Powered by FluxBB