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 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!

http://docs.postgresqlfr.org/9.1/functions-window.html

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
)

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

Pied de page des forums