#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
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
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