Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
Pages : 1
#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
Pages : 1