Précédent   Forum des professionnels en informatique > Bases de données > Oracle
Oracle Forum Oracle : le serveur, les outils, ... Voir F.A.Q Oracle Tutoriels Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 19/04/2007, 20h24   #1
Invité de passage
 
Inscription : avril 2007
Messages : 8
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 8
Points : 0
Points : 0
Par défaut Requête pour les rappel sur 5 jour

Bonjour,

j'essaye depuis 1 semaine de trouver une solution, mais rien à y faire. Je veux trouver la liste de tous les rappel qui on eu leux dans les 5 jour suivant l'incident original.

Je m'explique, lorsque quelqu'un appel et que le problème n'est pas résolu après le première appel (première enregistement) je dois compté combien de ce genre de problème il y a eu.

Je voudrais que à chaque fois qu'on trouve un problème dans la table pouvoir regarder les 5 jours qui suivent et vérifier si il y a eu des problèmes semblable. Si non je continue au prochain jour. Si oui alors je recommence ma recherche après le dernier jour ou il y a eu un problème similar

J'ai essayer une requète hierachique, mais ceci me disait qu'il y avait des référence cyclique.

J'ai essayer des sous requètes, mais dans ce cas là je me retrouvais avec des doublons dans la sous requêtes et je ne pouvais pas trouver dans la requête principal, les problème qui se retrouvais aussi dans la sous requête (chose que je ne veux pas)

Avec un LEFT OUTER JOIN, je pouvais faire un select distinct, mais le problème est que encore là je ne peux pas retiré de la table principal tous les résultat que l'on retrouve dans la table secondaire.

Est-ce que quelque pourrais m'aider.
Mbrillon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/04/2007, 20h43   #2
Membre Expert
 
Homme
Expert Datawarehouses + BO (sur BDD Oracle et SQL Server)
Inscription : mars 2003
Messages : 645
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 41
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Expert Datawarehouses + BO (sur BDD Oracle et SQL Server)

Informations forums :
Inscription : mars 2003
Messages : 645
Points : 1 165
Points : 1 165
avec des exemples, une structure de table, les requêtes utilisées ça pourrait faciliter les choses
phili_b est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/04/2007, 20h49   #3
Invité de passage
 
Inscription : avril 2007
Messages : 8
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 8
Points : 0
Points : 0
Ok

La table s'appel PROBLEMS

Je veux resortir les champ PROBLEM_ID, REPORT_DATE

Il faut que je sorte tous les problèmes qui on le même champ SYSTEM, COMPONENT, ITEM et IS_INVENTORY_ID. Il faut aussi que la REPORT_DATE soit égale ou supérieur ou problème original, mais ne dépasse par REPORT_DATE + 5

Je rattache cette table à une autre simplement pour avoir le nom de l'équipement au lieux d'un numéro, la table s'appel IS_INVENTORY, je ressort le champ ASSET_TAG et je rattache les deux table avec le champ IS_INVENTORY_ID

voici un aperçu d'une des requète hierachique avec laquelle j'avais le plus d'espoire

SELECT "PROBLEMS"."PROBLEM_ID", "PROBLEMS"."REPORT_DATE", "IS_INVENTORY"."ASSET_TAG", LEVEL

FROM "EXAV"."PROBLEMS" "PROBLEMS" INNER JOIN "EXAV"."IS_INVENTORY" ON

"PROBLEMS"."IS_INVENTORY_ID" ="IS_INVENTORY"."IS_INVENTORY_ID"

WHERE "PROBLEMS"."PROBLEM_CODE" <> 'ANNULE'
AND "PROBLEMS"."SYSTEM" IN ('PF MIC', 'PF FCDQ')
AND "PROBLEMS"."REPORT_DATE" >= SYSDATE -5
AND "PROBLEMS"."REPORT_DATE"< SYSDATE
CONNECT BY "PROBLEMS"."IS_INVENTORY_ID" = PRIOR "PROBLEMS"."IS_INVENTORY_ID"
AND "PROBLEMS"."SYSTEM" = PRIOR "PROBLEMS"."SYSTEM"
AND "PROBLEMS"."COMPONENT" = PRIOR "PROBLEMS"."COMPONENT"
AND "PROBLEMS"."ITEM" = PRIOR "PROBLEMS"."ITEM"
AND "PROBLEMS"."PROBLEM_ID" <> PRIOR "PROBLEMS"."PROBLEM_ID"
AND "PROBLEMS"."REPORT_DATE" >= PRIOR "PROBLEMS"."REPORT_DATE"
AND "PROBLEMS"."REPORT_DATE" < (PRIOR "PROBLEMS"."REPORT_DATE"+5)

Merci pour votre aide
Mbrillon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/04/2007, 23h30   #4
Membre Expert
 
Homme
Expert Datawarehouses + BO (sur BDD Oracle et SQL Server)
Inscription : mars 2003
Messages : 645
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 41
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Expert Datawarehouses + BO (sur BDD Oracle et SQL Server)

Informations forums :
Inscription : mars 2003
Messages : 645
Points : 1 165
Points : 1 165
Pas simple.
A première vue j'aurais tendance à utiliser une table Calendrier, comme cela on éviterait peut-être CONNECT BY.

Je ne peux pas l'affirmer à 100% mais j'ai l'impression qu'il y a trop de choses dans le CONNECT BY et qu'il ne faudrait faire la jointure avec la table IS_INVENTORY qu'une fois que le reste est résolu, ça complique les choses pour rien cette jointure.
phili_b est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/04/2007, 14h01   #5
Invité de passage
 
Inscription : avril 2007
Messages : 8
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 8
Points : 0
Points : 0
Une table Calendrier??

Pour le lien a IS_INVENTORY, c'est pas nécessaire imédiatement c'est certain, mais je dois l'avoir éventuellement.
Mbrillon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/04/2007, 13h38   #6
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 450
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 450
Points : 4 209
Points : 4 209
Est ce que cette requête convient à ton besoin ?
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
SELECT *
FROM problems p
WHERE p.problem_code    <> 'ANNULE'
AND p.SYSTEM            IN ('PF MIC', 'PF FCDQ')
AND p.report_date       BETWEEN SYSDATE - 5 AND SYSDATE
AND (SELECT MIN(p1.report_date)
     FROM problems p1
     WHERE p1.SYSTEM          = p.SYSTEM
     AND p1.component         = p.component
     AND p1.item              = p.item
     AND p1.is_inventory_id   = p.is_inventory_id
     AND p1.problem_id        <> p.problem_id
     AND ) BETWEEN p.report_date - 5 AND p.report_date
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/04/2007, 17h09   #7
Invité de passage
 
Inscription : avril 2007
Messages : 8
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 8
Points : 0
Points : 0
No unfortunately not.

I'm looking at data from the last year 2006-03 to 2007-03.

-> Basically I need all problems
-- then for each problem I need to verify if within 5 days of that
problem there is any number of problems with the same PROBLEM
SYSTEM, ITEM as the first.
-- If there is none then I continue listing the problems
-> I then need to count the total number of problems (not counting the ones that fall under the "within 5 days" rule and count the number of problems that do have similar problems within 5 days.

The idea behind this is to find all problems that would not be properly resolved on first call.

Thanks for any help you could give me
Mbrillon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/04/2007, 18h49   #8
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 450
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 450
Points : 4 209
Points : 4 209
A small test case would be nice.
Thanks
Exemple
Citation:
DATE PROBLEM SYSTEM ITEM
01/01/2007 1 1 1
04/01/2007 1 1 1
05/01/2007 1 1 2
11/01/2007 1 1 2
12/01/2007 1 1 2
13/01/2007 1 1 1
14/01/2007 1 1 1
15/01/2007 1 1 1
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/04/2007, 21h14   #9
Invité de passage
 
Inscription : avril 2007
Messages : 8
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 8
Points : 0
Points : 0
Ok here is what I would like
The level field is what I was thinking about originally for a hiearchic table

Code :
1
2
3
4
5
6
7
8
9
 
Problem ID      Date          System      Component       Item       Level
1        2006-03-01               1            1            5          1
2        2006-03-01               1            1            5          2
3        2006-03-04               1            1            5          2
4        2006-03-04               1            3            4          1
5        2006-03-09               1            1            5          1
6        2006-03-23               1            4            7          1
7        2006-03-27               1            4            7          2
Mbrillon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/04/2007, 21h30   #10
Rédacteur
 
Homme Salim
Développeur et DBA Oracle
Inscription : octobre 2006
Messages : 872
Détails du profil
Informations personnelles :
Nom : Homme Salim
Localisation : Canada

Informations professionnelles :
Activité : Développeur et DBA Oracle

Informations forums :
Inscription : octobre 2006
Messages : 872
Points : 1 100
Points : 1 100
Salut,

Messieurs, on est dans un forum francophone.
salim11 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/04/2007, 21h46   #11
Invité de passage
 
Inscription : avril 2007
Messages : 8
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 8
Points : 0
Points : 0
Désolé, j'ai poster dans tellement de forum que des fois je me mélanger

Désolé tous le monde
Mbrillon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/04/2007, 22h02   #12
Membre Expert
 
Homme
Expert Datawarehouses + BO (sur BDD Oracle et SQL Server)
Inscription : mars 2003
Messages : 645
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 41
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Expert Datawarehouses + BO (sur BDD Oracle et SQL Server)

Informations forums :
Inscription : mars 2003
Messages : 645
Points : 1 165
Points : 1 165
ça donnerait quelque chose en oracle comme:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
SELECT *
FROM problems p1
inner join CALENDRIER c
ON (p1.report_date-c.jour)/5=trunc((p1.report_date-c.jour)/5)
inner JOIN problems p2 on 
 p1.SYSTEM          = p.SYSTEM
     AND p2.component         = p1.component
     AND p2.item              = p1.item
     AND p2.is_inventory_id   = p1.is_inventory_id
     AND p2.problem_id        <> p1.problem_id
    AND p2.report_date=c.jour
WHERE p1.problem_code    <> 'ANNULE'
AND p1.SYSTEM            IN ('PF MIC', 'PF FCDQ')
(attention je n'ai pas vérifié de près la jointure entre p1 et p2)


Explication
(tests et explication en SQL server car je n'ai pas oracle sous la main)

1)
Présentation de l'utilisation de la table calendrier avec affichage tout les 5 jours (autour du 1er janvier 2005 pour ne pas dérouler tout le calendrier):
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
SELECT jour
FROM calendrier c
WHERE jour BETWEEN 
convert(datetime,'20041215',112) 
AND convert(datetime,'20050115',112)-- <- only for test
AND 
 cast((datediff(hour,convert(datetime,'20050101',112),c.jour)/24) AS decimal)/5=
 cast((datediff(hour,convert(datetime,'20050101',112),c.jour)/24) AS int)/5
 
jour                        
--------------------------- 
2004-12-17 00:00:00.000
2004-12-22 00:00:00.000
2004-12-27 00:00:00.000
2005-01-01 00:00:00.000
2005-01-06 00:00:00.000
2005-01-11 00:00:00.000
 
(6 ligne(s) affectée(s))

2)début de l'explication avec la table pubs.dbo.sales de sql server
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SELECT s1.ord_date ,c.jour
FROM sales  s1
INNER JOIN calendrier c 
ON  cast((datediff(hour,ord_date,c.jour)/24) AS decimal)/5=
(datediff(hour,ord_date,c.jour)/24)/5
WHERE stor_id=6380
 
1994-09-14 00:00:00.000     1995-08-20 00:00:00.000
1994-09-14 00:00:00.000     1995-08-25 00:00:00.000
1994-09-14 00:00:00.000     1995-08-30 00:00:00.000
1994-09-14 00:00:00.000     1995-09-04 00:00:00.000
1994-09-14 00:00:00.000     1995-09-09 00:00:00.000
1994-09-14 00:00:00.000     1995-09-14 00:00:00.000
1994-09-14 00:00:00.000     1995-09-19 00:00:00.000
1994-09-14 00:00:00.000     1995-09-24 00:00:00.000

3)avec les éléments suivants:

Code :
1
2
3
4
5
6
7
CREATE TABLE [dbo].[calendrier] ([jour] [datetime] NOT NULL ) ON [PRIMARY]
GO
 
ALTER TABLE [dbo].[calendrier] WITH NOCHECK ADD 
	CONSTRAINT [PK_calendrier] PRIMARY KEY  NONCLUSTERED 
	([jour]	)  ON [PRIMARY] 
GO
remplissage du calendrier
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
declare 
  @dt_debut datetime,
  @dt_fin datetime,
  @dt_encours datetime
begin
 SET @dt_debut=convert(datetime,'19900101',112)
 SET @dt_fin=convert(datetime,'20100101',112)
 SET  @dt_encours=@dt_debut
 
 while @dt_encours <@dt_fin
 begin
   print @dt_encours
    INSERT INTO calendrier (jour) SELECT @dt_encours
   SET @dt_encours =@dt_encours +1
 end
end


edit : précision : reste à rajouter quelque conditions entre p1 et p2
phili_b est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/04/2007, 22h04   #13
Rédacteur
 
Homme Salim
Développeur et DBA Oracle
Inscription : octobre 2006
Messages : 872
Détails du profil
Informations personnelles :
Nom : Homme Salim
Localisation : Canada

Informations professionnelles :
Activité : Développeur et DBA Oracle

Informations forums :
Inscription : octobre 2006
Messages : 872
Points : 1 100
Points : 1 100
salut,

Si j'ai bien compris, Si on a un probleme system=1 ,Component =1 , Item =5
qui date du 2006-03-07
alors le level sera de 3 ( c'est a dire c'est la troixième recherche que tu as fait )

Code :
1
2
3
4
5
6
7
8
9
10
Problem ID      Date          System      Component       Item       Level
1        2006-03-01               1            1            5          1
2        2006-03-01               1            1            5          2
3        2006-03-04               1            1            5          2
4        2006-03-04               1            3            4          1
5        2006-03-07               1            1            5          3
6        2006-03-09               1            1            5          1
7        2006-03-23               1            4            7          1
8        2006-03-27               1            4            7          2
salim11 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/04/2007, 22h24   #14
Invité de passage
 
Inscription : avril 2007
Messages : 8
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 8
Points : 0
Points : 0
Non je n'ai pas besoin de 3ième niveau, seulement 1 et 2 ième niveau

Pour l'explication avec une table Calendrier, j'ai jamais essayer ce genre de fonction et j'ai une peux de difficulté à comprendre comment ça fonctionne.

Pour votre information, je n'ai pas de droit d'écriture dans sur le serveur.

Merci encore pour tous votre aide
Mbrillon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/04/2007, 06h10   #15
Rédacteur
 
Inscription : septembre 2004
Messages : 626
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 626
Points : 622
Points : 622
Bonjour,


Et avec un lead ? :

Code :
1
2
3
4
5
6
7
8
 
SELECT  problem_id, report_date
FROM
   (
      SELECT  problem_id, report_date, lead(report_date) over(partition BY  problem, system, item ORDER BY report_date) next_call
      FROM    PROBLEMS
   )
WHERE next_call - report_date <= 5;
Laly.
__________________
In the heart of the truly greats, perfection is never achieved but endlessly pursued.

Mon article sur les fonctions analytiques d'Oracle (calcul de moyennes mobiles, de quartiles et bien d'autres...)
lalystar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/04/2007, 17h23   #16
Invité de passage
 
Inscription : avril 2007
Messages : 8
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 8
Points : 0
Points : 0
Le lead ne donnera t'il pas seulement 1 des 2 niveau que je requiert?
Mbrillon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/05/2007, 14h01   #17
Membre Expert
 
Homme
Expert Datawarehouses + BO (sur BDD Oracle et SQL Server)
Inscription : mars 2003
Messages : 645
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 41
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Expert Datawarehouses + BO (sur BDD Oracle et SQL Server)

Informations forums :
Inscription : mars 2003
Messages : 645
Points : 1 165
Points : 1 165
ça s'est résolu comment ?

C'était intéressant comme problématique.
phili_b est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 01h42.


 
 
 
 
Partenaires

Hébergement Web