Aide sur une requête de changement d'état

Fermé
flonox1980 Messages postés 1 Date d'inscription dimanche 22 juin 2014 Statut Membre Dernière intervention 22 juin 2014 - 22 juin 2014 à 10:43
cyril1982 Messages postés 110 Date d'inscription vendredi 7 mars 2014 Statut Membre Dernière intervention 19 septembre 2018 - 30 juin 2014 à 13:41
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 ....


Merci beaucoup de votre aide
A voir également:

2 réponses

cyril1982 Messages postés 110 Date d'inscription vendredi 7 mars 2014 Statut Membre Dernière intervention 19 septembre 2018 12
25 juin 2014 à 14:08
Bonjour,

Je n'ai pas la requête exacte à ton besoin, mais j'ai une piste :

Select Client, max(case when position % 2 = 0 then Etat else null end), max(case when position % 2 = 0 then null else Etat end),  max(case when position % 2 = 0 then null else Date end)
from (
	select Client, Etat, Date, ROW_NUMBER() OVER (PARTITION BY Client ORDER BY Date desc) as position from ma_table_clients
	) as table_position
group by Client, position / 2


N'ayant pas de base de données lancée sur mon poste, il peut y avoir des erreurs de syntaxe.

Explications :
Dans la sous-requête (table table_position), j'ajoute un champ position afin de trier les changements d'état de chaque client.
Ce qui renvoie :
Client0, Etat0, Date0, 0
Client0, Etat1, Date1, 1
Client0, Etat2, Date2, 2
Client1, Etat0, Date0, 0
Client1, Etat1, Date1, 1
Client1, Etat2, Date2, 2
...

Dans la requête principale, via "group by Client, position / 2", je regroupe les entrées de la table deux à deux pour chaque client.
Puis j'utilise les "case when" afin de récupérer les Etats/Date d'une position particulière.

Cette requête ne correspond pas tout à fait à ton besoin, en effet je regroupe deux à deux (0 avec 1, 2 avec 3, 4 avec 5 etc.) Alors que chaque entrée devrait être regrouper avec la précédente et la suivante (0 avec 1, 1 avec 2, 2 avec 3 etc.). De plus, je ne vérifie pas le changement d'état.

Bon courage !!
0
Bonjour,

merci beaucoup de ce retour très complet et clair.

je me mets à la tâche de suite, mais la solution est là.

Encore merci
0
cyril1982 Messages postés 110 Date d'inscription vendredi 7 mars 2014 Statut Membre Dernière intervention 19 septembre 2018 12
30 juin 2014 à 13:41
De rien, bon courage ^^
0