Vous n'êtes pas identifié(e).
Pages : 1
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
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
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
Quelle requête utilisez-vous pour récupérer ce résultat ?
Guillaume.
Hors ligne
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
En effet, c'est la solution ! Merci damalaan.
Thomas
Hors ligne
Pages : 1