PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 17/04/2014 15:42:22

[RESOLU] Avis sur requête (fenêtrage ?)

Bonjour,


Je souhaiterais avoir votre avis concernant la requête ci-dessous, afin que je sache si on peut faire plus simple ou non (les fonctions de fenêtrage peut-être ?). En résumé, j'interroge une unique table stockant des tronçons de réseau d'eau, dans laquelle j'ai une colonne géométrie stockant la forme et le positionnement de chaque tronçon et une colonne stockant la date de pose. Je souhaite calculer un pourcentage du linéaire en fonction de la date de pose. Ma requête me donne le résultat suivant :


 periode        | pourcent
----------------+-----------
 2005 - 2014    | 18.6
 1995 - 2004    | 16.1
 1985 - 1994    | 7.6
 1975 - 1984    | 19.0
 1965 - 1974    | 28.2
 1945 - 1964    | 10.2
 avant 1945     | 0.1
WITH total AS (SELECT sum(st_length(geom)) AS longueur_totale FROM c_3_0_3 WHERE datpose IS NOT NULL)

SELECT '2005 - 2014'::VARCHAR(11) AS periode, ((sum(st_length(geom))*100)/longueur_totale) AS pourcent FROM c_3_0_3, total WHERE datpose BETWEEN 2005 AND 2014 GROUP BY longueur_totale
union all
SELECT '1995 - 2004'::VARCHAR(11) AS periode, ((sum(st_length(geom))*100)/longueur_totale) AS pourcent FROM c_3_0_3, total WHERE datpose BETWEEN 1995 AND 2004 GROUP BY longueur_totale
union all
SELECT '1985 - 1994'::VARCHAR(11) AS periode, ((sum(st_length(geom))*100)/longueur_totale) AS pourcent FROM c_3_0_3, total WHERE datpose BETWEEN 1985 AND 1994 GROUP BY longueur_totale
union all
SELECT '1975 - 1984'::VARCHAR(11) AS periode, ((sum(st_length(geom))*100)/longueur_totale) AS pourcent FROM c_3_0_3, total WHERE datpose BETWEEN 1975 AND 1984 GROUP BY longueur_totale
union all
SELECT '1965 - 1674'::VARCHAR(11) AS periode, ((sum(st_length(geom))*100)/longueur_totale) AS pourcent FROM c_3_0_3, total WHERE datpose BETWEEN 1965 AND 1974 GROUP BY longueur_totale
union all
SELECT '1945 - 1964'::VARCHAR(11) AS periode, ((sum(st_length(geom))*100)/longueur_totale) AS pourcent FROM c_3_0_3, total WHERE datpose BETWEEN 1945 AND 1964 GROUP BY longueur_totale
union all
SELECT 'avant 1945'::VARCHAR(11) AS periode, ((sum(st_length(geom))*100)/longueur_totale) AS pourcent FROM c_3_0_3, total WHERE datpose <= 1944 GROUP BY longueur_totale ;

Merci pour vos avis !


Thomas

Dernière modification par Thomas Williamson (04/06/2014 09:16:48)

Hors ligne

#2 22/04/2014 16:13:14

damalaan
Membre

Re : [RESOLU] Avis sur requête (fenêtrage ?)

Bonjour

regarde ce fil que j'avais ouvert il y a qq temps déjà
http://forums.postgresql.fr/viewtopic.php?id=2122

tu peux essayer avec ça :
select * from generate_series(2014,1945,-10);

Hors ligne

#3 02/06/2014 14:44:28

Re : [RESOLU] Avis sur requête (fenêtrage ?)

Bonjour,


Je me permets de relancer ce post car je m'arrache un peu les cheveux dessus. Merci damalaan pour ton lien mais ce n'est pas exactement ce que je cherche à faire... J'ai besoin de faire des regroupements par périodes (somme du linéaire pour la période 1945-1964, pour la période 1965-1980, etc.). L'exemple donné par damalaan permet de dénombrer des occurrences par valeur, mais pas par groupe de valeurs.


La solution que je donne est assez tirée par les cheveux. De plus, il suffit que je n'ai aucun objet daté dans une des périodes et cette période n'apparaît pas dans le résultat. Par exemple, si je n'ai aucun objet daté entre 1995 et 2004 dans ma table c_3_0_3, je vais avoir un résultat comme suit :


 periode        | pourcent
----------------+-----------
 2005 - 2014    | 18.6
 1985 - 1994    | 7.6
 1975 - 1984    | 19.0
 1965 - 1974    | 28.2
 1945 - 1964    | 10.2
 avant 1945     | 0.1


Merci encore pour vos avis !


Thomas

Dernière modification par Thomas Williamson (02/06/2014 14:44:46)

Hors ligne

#4 02/06/2014 21:17:24

gleu
Administrateur

Re : [RESOLU] Avis sur requête (fenêtrage ?)

Quelle requête utilisez-vous pour récupérer ce résultat ?


Guillaume.

Hors ligne

#5 03/06/2014 15:50:51

damalaan
Membre

Re : [RESOLU] Avis sur requête (fenêtrage ?)

Avez-vous essayé de :
-créer une table période :
          periode | debut | fin
          1          |1900   |1945
          2          |1946   |1964
          3          |1965   |1974
          4          |1975   |1984
etc

-et ensuite de faire votre calcul avec une jointure sur cette table du genre (code non testé!!, mais j'utilise un truc de ce genre pour des périodes un peu ésotériques!)

select periode, ((sum(st_length(geom))*100)/longueur_totale) AS pourcent FROM c_3_0_3
JOIN tbl_periode g ON datpose >= g.debut AND datpose  <= g.fin
group by periode

Hors ligne

#6 04/06/2014 09:16:23

Re : [RESOLU] Avis sur requête (fenêtrage ?)

En effet, c'est la solution ! Merci damalaan.


Thomas

Hors ligne

Pied de page des forums