Bonjour,
Je dois retourner la valeur médiane d'un nombre d'appel quotidien, avec des jours sans appels.
Exemple :
La médiane du nombre d'appels du 20/09/2008 au 22/09/2008 inclus sera 3.
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 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 :
Mon jeu de test est le suivant :
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) )
Ce qui doit donner avec WITH :
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
Je suis sous Oracle 9i.
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 )
Voici la requête que j'ai tant bien que mal réussi à faire :
Cette requête me retourne 3.
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;
En changeant les dates pour :
J'obtiens NULL.
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;
Par contre, lorsque je teste :
J'obtiens 3, au lieu de 0.
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;
Comment faire pour que les dates sans enregistrements dans la table soient pris en compte ?
D'avance, merci.
Partager