Bonjour,

Je dois retourner la valeur médiane d'un nombre d'appel quotidien, avec des jours sans appels.
Exemple :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
 
DATE_APPEL           NOMBRE_APPEL
----------           ------------
20/09/2008                     3
21/09/2008                     5
23/09/2008                     1
La médiane du nombre d'appels du 20/09/2008 au 22/09/2008 inclus sera 3.
La médiane du nombre d'appels du 21/09/2008 au 23/09/2008 inclus sera 1.
La médiane du nombre d'appels du 20/09/2008 au 23/09/2008 inclus sera sauf erreur 2 (valeur du 20/09/2008 = 3 + valeur du 22/09/2008 = 1 le tout divisé par 2)..

Je dispose d'une table statistique de la structure suivante :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
 
create table STATISTIQUE  (
   ID_STATISTIQUE       NUMBER                           not null,
   ID_CLIENT            NUMBER(4),
   DATE_APPEL           DATE                             not null,
   METHODE_APPELEE      VARCHAR(15)                      not null,
   constraint PK_STATISTIQUE primary key (ID_STATISTIQUE)
)
Mon jeu de test est le suivant :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
 
ID_STATISTIQUE  ID_CLIENT  DATE_APPEL  METHODE_APPELEE 
--------------  ---------  ----------  ---------------
1               2          30/09/08    controle        
2               2          30/09/08    controle        
3               2          30/09/08    controle
Ce qui doit donner avec WITH :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
 
WITH zTestMedianne AS (SELECT 1 ID_STATISTIQUE, to_date('2008-09-30','yyyy-mm-dd') date_appel, 2 ID_CLIENT, 'controle' METHODE_APPELEE FROM DUAL 
UNION ALL SELECT 2 ID_STATISTIQUE, to_date('2008-09-30','yyyy-mm-dd') date_appel, 2 ID_CLIENT, 'controle' METHODE_APPELEE FROM DUAL 
UNION ALL SELECT 3 ID_STATISTIQUE, to_date('2008-09-30','yyyy-mm-dd') date_appel, 2 ID_CLIENT, 'controle' METHODE_APPELEE FROM DUAL 
 )
Je suis sous Oracle 9i.

Voici la requête que j'ai tant bien que mal réussi à faire :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
 
select percentile_cont(0.5) within group (order by (count(date_appel)) NULLS FIRST) 
over (partition by date_appel) MEDIANE
from STATISTIQUE
where id_client=2 and
date_appel >= to_date('2008-09-30','yyyy-mm-dd') and date_appel <= to_date('2008-09-30','yyyy-mm-dd')
group by date_appel;
Cette requête me retourne 3.
En changeant les dates pour :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
 
select percentile_cont(0.5) within group (order by (count(date_appel)) NULLS FIRST) 
over (partition by date_appel) MEDIANE
from STATISTIQUE
where id_client=2 and
date_appel >= to_date('2008-09-20','yyyy-mm-dd') and date_appel <= to_date('2008-09-22','yyyy-mm-dd')
group by date_appel;
J'obtiens NULL.
Par contre, lorsque je teste :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
 
select percentile_cont(0.5) within group (order by (count(date_appel)) NULLS FIRST) 
over (partition by date_appel) MEDIANE
from STATISTIQUE
where id_client=2 and
date_appel >= to_date('2008-09-28','yyyy-mm-dd') and date_appel <= to_date('2008-09-30','yyyy-mm-dd')
group by date_appel;
J'obtiens 3, au lieu de 0.

Comment faire pour que les dates sans enregistrements dans la table soient pris en compte ?

D'avance, merci.