Résolu Aide sur Requête SQL

Solutions (3)
|
Bonjour à tous,

Je me permets de vous solliciter car je sèche. Je suis loin d’être un expert et j’ai vraiment besoin d’aide.

Je vous explique le besoin. Je travaille sur une base Oracle, j’aimerai donc trouver une solution en sql Oracle.

Partons du principe que j’ai une table contenant « les photos » à des instants datés d’éléments comme suit :

Client / Etat / Date
C1 / O / 01/01/2012
C1 / O / 04/01/2012
C1 / N / 06/01/2012
C1 / N / 07/01/2012
C1 / O / 12/01/2012
C1 / O / 24/01/2012
C1 / O / 01/06/2012
C1 / O / 06/06/2012
C1 / N / 20/06/2012
C2 …



Je cherche à identifier chaque changement d’Etat sous la forme :

Client / Etat Précédent / Etat de changement / Date de changement / Délai entre précédente « photo » d'un client et date de changement d'état

C1 / O / N / 06/01/2012 / 2
C1 / N / O / 12/01/2012 / 5
C1 / O / N / 20/06/2012 / 14
C2 ….

Joli challenge non ?
Merci beaucoup de votre aide
Contenus similaires
Meilleure solution
partage
, Modérateur |
J'ai bien aimé ton challenge, alors j'ai pris quelques minutes pour faire ça.
J'ai fait ça en T-SQL par contre, n'ayant qu'un SQL Server à portée... CROSS APPLY a l'air d'exister aussi sous Oracle, donc ça devrait le faire :
  1. SELECT p1.Client, p1.Etat AS EtatPrecedent, p2.Etat AS EtatChangement, p2.DATE AS DateChangement, DATEDIFF(d, MAX(p1.DATE), p2.DATE) AS Delais
  2. FROM Photos p1
  3. CROSS APPLY (
  4. SELECT TOP 1 *
  5. FROM Photos p2
  6. WHERE p1.Client = p2.Client AND p1.Etat <> p2.Etat AND p1.DATE < p2.DATE
  7. ORDER BY p2.DATE) p2
  8. WHERE p1.Client = p2.Client
  9. GROUP BY p1.Client, p1.Etat, p2.Etat, p2.DATE
  10. ORDER BY 1, 4


Voici un fiddle pour voir ça en action : http://sqlfiddle.com/#!3/4c3a1/2
  • Dreamcaster a sélectionné cette solution comme la meilleure réponse
  • OmaR a édité ce message
  • OmaR a édité ce message
  • Commenter cette solution |
Score
0
òh
òi
, Animateur |
Bonjour,

S'il n'y a que 2 états possibles, le champs "Etat précédent" n'a que peu d'intérêt car il est forcément l'opposé de l'état actuel. Tu peux supprimer ce champs.

Je te conseille également de mettre une date dans le dernier champs plutôt qu'un champs calculé. Cela est plus pratique si tu as besoin de faire des calculs sur ce champs dans le futur (comme le nombre de changements en base pour une période donnée, etc).
  • dandibot a édité ce message
  • Commenter cette réponse |
Score
0
òh
òi
|
2 possibilités:
- Si tu veux faire ça en simple requête SQL, il faut faire une jointure sur la même table pour trouver pour chaque ligne (de la première table) la date max (de la seconde table) inférieure stricte à la date de la ligne (de la première table), le tout pour un même client.
- sinon tu peux faire une procédure stockée, avec par exemple des paramètres indiquant la date de début et de fin à traiter, tu fais la boucle sur les lignes, tu détermines le changement et tu mémorises le résultat dans une autre table.
  • Commenter cette réponse |

Ce n'est pas ce que vous cherchiez ?

Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS