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/04/2013 14:58:55

palex
Membre

Calcul entre 2 dates et valeur null

bonjour à tous

je dispose de ce jeux de données:

 select  groupeid,datecreationitem from itemagenda where typeitemagenda = 5  and groupeid in(12225,12376)  order by groupeid,datecreationitem ;
 groupeid |  datecreationitem   
----------+---------------------
    12225 | 2013-04-02 00:00:00
    12225 | 2013-04-16 00:00:00
    12225 | 2013-04-30 00:00:00
    12225 | 2013-05-17 00:00:00
    12225 | 2013-06-03 00:00:00
    12376 | 2013-03-27 00:00:00
    12376 | 2013-04-04 00:00:00
    12376 | 2013-04-11 00:00:00
    12376 | 2013-04-18 00:00:00
    12376 | 2013-04-25 00:00:00

groupeId étant un identifiant magasin et datecreationitem étant simplement des dates de livraison

j'ai besoin pour chaque groupeid de calculer le nombre de jour entre la date du jour et la 2eme date de livraison qui est supérieur à la date du jour donc en gros je veux avoir  au final :

1/ Je prends les dates qui sont supérieur à maintenant et ensuite je prend l'indice 2 et je calcul la différence pour avoir le nombre de jour:

select  groupeid,datecreationitem from itemagenda where typeitemagenda = 5  and groupeid in(12225,12376) and datecreationitem > now() order by groupeid,datecreationitem ;
 groupeid |  datecreationitem   
----------+---------------------
    12225 | 2013-04-30 00:00:00
    12225 | 2013-05-17 00:00:00
    12225 | 2013-06-03 00:00:00
    12376 | 2013-04-25 00:00:00
(4 rows)

donc pour le groupeid 12225 cela me donne 2013-05-17 00:00:00 - now() et pour 12376 null - now() (donc rien)

2/pour au final faire cela en une requete voici la requete final que j'ai immaginé:

select  distinct groupeid, nth_value(datecreationitem,2)  over (partition by groupeid  order by datecreationitem) - now()  from itemagenda where typeitemagenda = 5 and datecreationitem > now()  order by groupeid ;

ce qui me retourne ce genre de chose:

groupeid |        ?column?         
----------+-------------------------
    11467 | 32 days 09:07:11.020451
    11467 | 
    11472 | 
    11472 | 21 days 09:07:11.020451
    11640 | 32 days 09:07:11.020451
    11640 | 
    11745 | 
    11745 | 28 days 09:07:11.020451
    11778 | 
    11801 | 
    11801 | 33 days 09:07:11.020451
    12225 | 
    12225 | 28 days 09:07:11.020451
    12344 | 28 days 09:07:11.020451
    12376 | 
    12381 | 

on remarque que les calculs sont correct car pour les 2 groupeid que j'ai pris en exemple au début la requête me ressort bien 28jours pour le 12225 et pour 12376 rien du tout car il n'y a pas de date comme on a pu le voir précédemment.

ma question est pourquoi toute les lignes se retrouve doublé avec une ligne vide? pourquoi par exemple mon groupeid 12225 as 2 lignes?

  12225 | 
  12225 | 28 days 09:07:11.020451

d'ou viens la ligne vide?

je ne demande pas spécialement de solution ou comment vous auriez fait mais je cherche à comprendre le résultat de ma requête, je pensais avoir toute les lignes sans les lignes vide...
je peux m'en sortir avec ce résultat car dans mon code par la suite il me suffit de ne pas tenir compte des lignes vide etc...

merci beaucoup

Dernière modification par palex (18/04/2013 14:59:57)

Hors ligne

#2 18/04/2013 17:53:34

jacques
Membre

Re : Calcul entre 2 dates et valeur null

Bonjour,

Contrairement aux fonctions de groupe qui par définition ne renvoient qu'une seule ligne par groupe (GROUP BY), les fonctions analytiques renvoient toutes les lignes des partitions (PARTITION BY).

Cordialement

Hors ligne

Pied de page des forums