Bonjour J'ai une petit problème que je souhaiterais résoudre en sql mais je bloque depuis deux jours, j'ai le sentiment que c'est impossible à écrire en sql :
j'ai donc une table
identifiant, date_debut, date_fin, valeur1
la clef primaire de cette table est (identifiant, date_debut)
Le but est d'obtenir le recap des modif de la valeur1 avec la date de debut et la date de fin de la valeur1
exemple: table de travail :
identifiant,date_debut,date_fin,valeur1
toto,12/11/2011,12/11/2012, 300
toto,13/11/2012,15/11/2012, 350
toto,16/11/2012,15/11/2014, 350
toto,16/11/2014,15/11/2015, 350
toto,16/11/2015,17/12/2015, 400
si au fil du temps (au fil de la date de debut) la valeur1 ne régresse pas, on ne peut donc pas retomber sur une valeur1 qui existait déjà avant et ça se fait sans réèl problème pour qui connait la fonction analytique partition by :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 select table_de_travail.identifiant, min(table_de_travai.date_debut) over(partition by table_de_travail.identifiant,table_de_travail.valeur1) as min_date_debut , max(table_de_travai.date_fin) over(partition by table_de_travail.identifiant,table_de_travail.valeur1) as max_date_fin, table_de_travail.valeur1 from table_de_travail trable_de_travail
On obtient assez facilement
toto,12/11/2011,12/11/2012, 300
toto,13/11/2012,15/11/2015, 350
toto,16/11/2015,17/12/2015, 400
Mais là où ça se corse véritablement, c'est qd on a en entree par exemple
toto,12/11/2011,12/11/2012, 300
toto,13/11/2012,15/11/2012, 350
toto,16/11/2012,15/11/2014, 350
toto,16/11/2014,15/11/2015, 350
toto,16/11/2015,17/12/2015, 400
toto,18/12/2015,12/11/2016, 300
et que l'on souhaiterais obtenir :
toto,12/11/2011,12/11/2012, 300
toto,13/11/2012,15/11/2015, 350
toto,16/11/2015,17/12/2015, 400
toto,18/12/2015,12/11/2016, 300
Car la requete que j'ai écrite va traité (toto,300) sans prendre en compte la rupture avec date de debut.
J'ai regardé à coté des clause de fenetrage.
Quelqun a il une idée?
Au pire je traiterais ce problème d'une manière séquentiel. Merci de votre lecture!
Partager