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 18/09/2018 17:17:58

HadanMarv
Membre

Fonction de fenêtrage

Bonjour,

Je suis confronté a une petite problématique dans une requête.
J'ai une table contenu plusieurs enregistrement par jour.
Avec un count,un generate series et un group by j'arrive à trouver facilement le nombre d'enregistrement par jour même si je n'en ai pas.
Maintenant çà ce complique, je dois déterminer si j'ai trois jours consécutifs pour lesquelles je n'ai pas d'enregistrement.
Je pense qu'avec les fonctions de fenêtrage, il doit y avoir une solution, mais je n'ai pas encore trouvé laquelle.
Avez-vous une idée ?

D'avance merci de votre aide.

HadanMarv

Dernière modification par HadanMarv (18/09/2018 17:18:26)

Hors ligne

#2 18/09/2018 18:15:28

gleu
Administrateur

Re : Fonction de fenêtrage

Mieux vaut passer par la fonction generate_series().


Guillaume.

Hors ligne

#3 19/09/2018 09:25:32

HadanMarv
Membre

Re : Fonction de fenêtrage

Le generate_series m'est utile pour faire un count du nombre d'enregistrement par jour.
Données initiales :

ID     DATE               HEURE    VALUE
1       01/09/2018      01:45:52  TEST0
2       01/09/2018      02:50:01  TEST1
3       02/09/2018      12:45:00  TEST2
4       02/09/2018      13:20:57  TEST3
5       02/09/2018      17:37:14  TEST4
6       04/09/2018      05:45:27  TEST5
7       04/09/2018      07:57:22  TEST6
8       05/09/2018      12:22:01  TEST7
9       09/09/2018      11:45:21  TEST8
10     09/09/2018      18:45:22  TEST9

avec un generate_series, un count et un group by j'obtiens :

DATE               COUNT_ROW
01/09/2018      2
02/09/2018      3
03/09/2018      0
04/09/2018      2
05/09/2018      1
06/09/2018      0
07/09/2018      0
08/09/2018      0
09/09/2018      2

Maintenant je voudrais écrire une requête qui me permettrait de détecter que je n'ai aucune données entre le 06/09/2018 et le 08/09/2018 car 3 jours sans rien.
Je ne sais pas si je suis plus clair

HadanMarv

Hors ligne

#4 19/09/2018 15:38:53

dverite
Membre

Re : Fonction de fenêtrage

Vous pouvez utiliser LEAD avec un fenêtrage, qui donne la valeur d'une colonne sur les lignes suivantes par rapport à un ordre spécifié explicitement.

Par exemple:

SELECT autres colonnes,
  lead(count_row,1) over(w) as suivant1,
  lead(count_row,2) over(w) as suivant2,
  lead(count_row,3) over(w) as suivant3
FROM table
WINDOW w AS (ORDER BY date)

La condition que vous voulez est satisfaite quand suivant1 et suivant2 et suivant3 sont tous à zéro.

Attention au fait que LEAD(colonne, N) renvoie NULL quand le décalage N sort des limites du jeu de données.

Hors ligne

#5 19/09/2018 16:40:11

HadanMarv
Membre

Re : Fonction de fenêtrage

Impeccable, çà fonctionne.
Merci beaucoup

Hors ligne

Pied de page des forums