Transformation de structure de table
Najac
-
RV71 Messages postés 620 Date d'inscription Statut Membre Dernière intervention -
RV71 Messages postés 620 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
Je vais tenter d'expliquer simplement mon problème et je m'excuse par avance si ce n'est pas le cas =)
Dans une base de données SQL, je remplis une table avec des données historisées de la forme suivante :
colonne 1 : Date de modification de la donnée
colonne 2 : Valeur de la donnée (exemple : prix d'un article)
J'ai donc l'évolution du prix d'un article dans le temps.
Exemple :
| DATE | PRIX |
| 2020-01-01 | 100 |
| 2020-07-10 | 90 |
| 2020-08-13 | 120 |
| 2020-09-03 | 110 |
Je souhaiterais transformer cette structure de table pour obtenir une nouvelle table avec la suivante :
colonne 1 : Date de début de la période
colonne 2 : Date de fin de la période
colonne 3 : Valeur de la donnée (exemple : prix d'un article)
Et donc obtenir la période de temps pendant laquelle mon article a un prix donné.
Exemple :
| DEBUT | FIN | PRIX |
| 2020-01-01 | 2020-07-10 | 100 |
| 2020-07-10 | 2020-08-13 | 90 |
| 2020-08-13 | 2020-09-03 | 120 |
| 2020-09-03 | | 110 |
L'un de vous pourrait-il m'indiquer des pistes pour écrire la requête SQL me permettant d'obtenir la seconde table ?
Je vous remercie par avance !!
Najac
Je vais tenter d'expliquer simplement mon problème et je m'excuse par avance si ce n'est pas le cas =)
Dans une base de données SQL, je remplis une table avec des données historisées de la forme suivante :
colonne 1 : Date de modification de la donnée
colonne 2 : Valeur de la donnée (exemple : prix d'un article)
J'ai donc l'évolution du prix d'un article dans le temps.
Exemple :
| DATE | PRIX |
| 2020-01-01 | 100 |
| 2020-07-10 | 90 |
| 2020-08-13 | 120 |
| 2020-09-03 | 110 |
Je souhaiterais transformer cette structure de table pour obtenir une nouvelle table avec la suivante :
colonne 1 : Date de début de la période
colonne 2 : Date de fin de la période
colonne 3 : Valeur de la donnée (exemple : prix d'un article)
Et donc obtenir la période de temps pendant laquelle mon article a un prix donné.
Exemple :
| DEBUT | FIN | PRIX |
| 2020-01-01 | 2020-07-10 | 100 |
| 2020-07-10 | 2020-08-13 | 90 |
| 2020-08-13 | 2020-09-03 | 120 |
| 2020-09-03 | | 110 |
L'un de vous pourrait-il m'indiquer des pistes pour écrire la requête SQL me permettant d'obtenir la seconde table ?
Je vous remercie par avance !!
Najac
Configuration: Windows / Chrome 85.0.4183.102
5 réponses
-
Bonjour,
je pense que cela pourrait convenir :
https://blog.sodifrance.fr/fonctions-lead-et-lag-dans-sql-server/
A+ -
Bonjour,
Il n'y a pas d'autre colonne dans ta table, notamment une colonne d'identifiant, du genre id_article ? Ça va changer la requête s'il faut gérer un groupement des données.
Sinon je suis en phase avec RV71 dans son analyse de la méthode à utiliser (et je découvre au passage ces fonctions, en pensant à toutes ces fois où je les contournais à grands coups de cte et autojointures... *petite larme*)
Xavier -
@Reivax : Oui effectivement il y a une colonne d'ID de l'article...
@RV : Merci pour le tuyau je vais étudier ces fonctions de prés ! ;-) -
yg_be Messages postés 23437 Date d'inscription Statut Contributeur Dernière intervention Ambassadeur 1 588
bonjour, dans ce genre de situation, je travaillerais différemment:
- je garderais la table telle qu'elle est
- je créerais une requête qui fournit les données comme tu le décris
- je n'utiliserais pas cette requête pour créer une nouvelle table, mais j'utiliserais directement la requête comme source pour le reste du travail -
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question -
Hello !
Je viens (enfin) de tester la fonction lead (et sa copine lag!).
C'est EXACTEMENT ce qu'il me fallait !!
Merci, merci, merci, merci @RV71 !!!
Pour ceux qui aurait besoin, voici la requête :SELECT [CODE_ARTICLE], [DATE] as [DEBUT], LEAD([DATE],1) OVER (partition by [CODE_ARTICLE] order by [ID_HISTO_PRIX_ARTICLE]) as [FIN], [PRIX] FROM [HISTO_PRIX_ARTICLE]