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 Thu 07 September 2023 12:08

Jkerebel04
Participant occasionnel
Lieu: Oraison
Date d'inscription: 21 Apr 2020
Messages: 26

QGIS: Selection en fonction des sommes de valeurs d'attribut

Bonjour à tous.
Je viens vers vous car je tourne un peu en rond sur ma problématique.

Sur Postgis, je recherche à sélectionner les x premières entités dont la sommes des longueurs représente 10% de la totalité des longueurs…

J’ai tenté pour commencé:
SELECT id FROM ma_table WHERE sum(ma_table.longueur)=100

ou encore

SELECT id FROM ma_table LIMIT sum(ma_table.longueur)=100

Mais les fonctions d’agrégats ne sont autorisées dans WHERE ni dans LIMIT.

Auriez-vous une piste, une alternative  SVP ?

Jérôme


« Patience et longueur de temps font plus que force et ni que rage » -  Jean de La Fontaine, Le Lion et le Rat.

Hors ligne

 

#2 Thu 07 September 2023 14:43

anthony.v
Participant occasionnel
Date d'inscription: 13 Apr 2023
Messages: 25

Re: QGIS: Selection en fonction des sommes de valeurs d'attribut

Bonjour,

Je ne sais pas s'il existe une solution plus "propre", mais celle présentée ici semble fonctionner : https://stackoverflow.com/questions/105 … is-reached

Hors ligne

 

#3 Wed 20 September 2023 12:05

Jkerebel04
Participant occasionnel
Lieu: Oraison
Date d'inscription: 21 Apr 2020
Messages: 26

Re: QGIS: Selection en fonction des sommes de valeurs d'attribut

Bonjour, et merci beaucoup pour le lien.
Cela fonctionne parfaitement.
Attention néanmoins. Dans mon cas, j'ai besoin de faire un ORDER_BY sur un attribut et non sur l'ID. Et la requête fonctionnait mal car cet attribut comprend beaucoup de valeurs redondantes. Aussi j'ai du passer par une table intermédiaire pour rajouter un champ 'serial' reprenant le classement souhaité. Après quoi ça roule.

Code:

 -- Création d'une table de passage pour ordonner la table suivant le l'attribut prod_crit
     DROP TABLE IF EXISTS amdec_cana_xls2 ;
    CREATE TABLE amdec_cana_xls2 AS
     SELECT
    id, fonction, mat_diam, nb_inter_aep, annee_pose, crit_fonc, crit_diam, crit_mat, crit_age, crit_argi, crit_brt_plom, prod_crit, nom_rue, longueur, retenu, geom, rang, etiquette, crit_inter_aep, cod_insee
    FROM public.amdec_cana_xls
    ORDER BY prod_crit DESC;
-- Ajout d'une colonne serial d'indexation    
    ALTER TABLE amdec_cana_xls2 ADD COLUMN classement serial;
    
-- Selection des entités en fonction du cumul des longueurs, dans l'ordre d'indexation        
select id, 
       prod_crit,
       longueur, 
       cumul_longueur
from (
    select 
        id,
        prod_crit, 
        longueur,
        sum(longueur) over (order by classement asc) as cumul_longueur
    from amdec_cana_xls2
) t
where cumul_longueur <= 2000

Dernière modification par Jkerebel04 (Wed 20 September 2023 12:05)


« Patience et longueur de temps font plus que force et ni que rage » -  Jean de La Fontaine, Le Lion et le Rat.

Hors ligne

 

Pied de page des forums

Powered by FluxBB