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 !.
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

#1 mar. 14 novembre 2017 13:12

bruhnild
Membre
Lieu: Lyon
Date d'inscription: 7 juin 2014
Messages: 48

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 (mar. 14 novembre 2017 13:54)

Hors ligne

 

#2 mar. 14 novembre 2017 13:50

Pascal Boulerie
Membre
Lieu: France
Date d'inscription: 12 sept. 2005
Messages: 1525
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

Hors ligne

 

#3 mar. 14 novembre 2017 13:54

bruhnild
Membre
Lieu: Lyon
Date d'inscription: 7 juin 2014
Messages: 48

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 mar. 14 novembre 2017 14:03

Sylvain M.
Membre
Lieu: Carrouges, Orne (61)
Date d'inscription: 8 sept. 2005
Messages: 175

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 mar. 14 novembre 2017 14:20

jmarsac
Membre
Lieu: NICE
Date d'inscription: 26 oct. 2005
Messages: 215
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

Hors ligne

 

#6 mar. 14 novembre 2017 14:20

Sylvain M.
Membre
Lieu: Carrouges, Orne (61)
Date d'inscription: 8 sept. 2005
Messages: 175

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 mar. 14 novembre 2017 14:27

ChristopheV
Membre
Lieu: Ajaccio
Date d'inscription: 7 sept. 2005
Messages: 2406
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 mar. 14 novembre 2017 15:34

bruhnild
Membre
Lieu: Lyon
Date d'inscription: 7 juin 2014
Messages: 48

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 lun. 20 novembre 2017 10:34

bruhnild
Membre
Lieu: Lyon
Date d'inscription: 7 juin 2014
Messages: 48

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 lun. 20 novembre 2017 11:05

tumasgiu
Membre
Lieu: Ajaccio
Date d'inscription: 5 juil. 2010
Messages: 502

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 (lun. 20 novembre 2017 11:10)

Hors ligne

 

#11 lun. 20 novembre 2017 11:14

ChristopheV
Membre
Lieu: Ajaccio
Date d'inscription: 7 sept. 2005
Messages: 2406
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

Partagez  |