Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
Pages : 1
#1 09/11/2012 12:30:43
- ziranoa
- Membre
comptage de valeurs consécutives
Bonjour,
Je débute... et utilise postgresql pour gérer des chroniques de débits. mon problème:
Je veux calculer un nombre de jours consécutifs sur une série de débits, par rapport à une valeur seuil
ex.
- trouver le nombre de jour consécutifs où le débit est inférieur à 4
- table entrée:
date débit
....
01/06/2011 5.2
02/06/2011 6.0
03/06/2011 2.3
04/06/2001 2.1
05/06/2011 2.0
06/06/2011 5.1
07/06/2011 3.2
08/06/2011 2.9
09/06/2011 4.5
10/06/2011 4.1
...
- retour cherché:
date debut nbre_jrs
03/06/2011 3
07/06/2011 2
(pour info la chronique inclue ts les jours entre 01/01/1969 à 31/12/2011).
voilà, si vous avez une idée et du temps.... merci d'avance
Hors ligne
#2 12/11/2012 09:59:19
- David
- Membre
Re : comptage de valeurs consécutives
Voila un bon exercice pour se débloquer le cerveau en ce début de semaine !
Une première idée....
Cdlt
select * from debit;
date | debit
---------------------+-------
2012-01-01 00:00:00 | 1.2
2012-01-02 00:00:00 | 8.4
2012-01-03 00:00:00 | 8.2
2012-01-04 00:00:00 | 1.0
2012-01-05 00:00:00 | 1.0
2012-01-06 00:00:00 | 1.0
2012-01-07 00:00:00 | 1.0
2012-01-08 00:00:00 | 1.4
2012-01-09 00:00:00 | 51.4
2012-01-10 00:00:00 | 0.4
2012-01-11 00:00:00 | 0.4
2012-01-12 00:00:00 | 0.4
2012-01-13 00:00:00 | 0.0
2012-01-14 00:00:00 | 0.0
(14 lignes)
select min(D1) date_debut, debit, count(*)+1 from
(select d1.date D1, d2.date D2, d1.debit Debit from debit d1, debit d2
where d2.date = d1.date + interval '1 day' ::interval and d1.debit=d2.debit and d1.debit >= 0) R1
group by debit;
date_debut| debit | ?column?
---------------------+-------+----------
2012-01-13 00:00:00 | 0.0 | 2
2012-01-10 00:00:00 | 0.4 | 3
2012-01-04 00:00:00 | 1.0 | 4
Hors ligne
#3 12/11/2012 13:01:44
- ziranoa
- Membre
Re : comptage de valeurs consécutives
merci pour ce code David, cela me donne une piste.
Le problème c'est que les débits ne sont jamais égaux du jour au lendemain, même si je les arrondis... je pense que je dois mettre en place un système de compteur... je vais continuer à chercher
Hors ligne
#4 12/11/2012 21:44:10
- damalaan
- Membre
Re : comptage de valeurs consécutives
Je pense que je passerais par les fonctions de fenêtrage et notamment les fonctions lag ou lead pour comparer les lignes entre elles
pour la syntaxe exacte, regardez la doc, car comme ça j'aurais du mal à vous donner un code correct!
Hors ligne
#5 12/11/2012 23:55:14
- rjuju
- Administrateur
Re : comptage de valeurs consécutives
Bonjour,
je n'ai pas trouvé de solution simple, voilà une requête qui a l'air de marcher, si quelqu'un a une requête plus simple
WITH RECURSIVE tree(nb,laref,ladate,debit,split) as (
SELECT 1 as nb,ladate,* FROM (SELECT *,CASE WHEN (ladate-lag(ladate) OVER (ORDER BY ladate)) = 1 THEN 0 ELSE 1 END AS split FROM comptage WHERE debit < 4.0)sql where split = 1
UNION
SELECT tree.nb+1,tree.laref,sql.ladate,tree.debit,tree.split
FROM tree
JOIN (SELECT * FROM (SELECT *,CASE WHEN (ladate-lag(ladate) OVER (ORDER BY ladate)) = 1 THEN 0 ELSE 1 END AS split FROM comptage WHERE debit < 4.0)t WHERE split = 0) sql
ON sql.ladate-tree.ladate=1
AND sql.split = 0
)
SELECT laref,max(nb)
FROM tree
GROUP BY laref
ORDER BY laref
pour info voilà la table :
CREATE TABLE comptage
(
ladate date,
debit double precision
)
Julien.
https://rjuju.github.io/
Hors ligne
#6 13/11/2012 10:56:11
- ziranoa
- Membre
Re : comptage de valeurs consécutives
Rjuju merci.
Cette requête fonctionne avec mes données et je me retrouve bien avec ce que je cherchait. je crois même avoir compris son fonctionnement!
un grand merci à tous!
Hors ligne
Pages : 1