Transformation de structure de table

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
Configuration: Windows / Chrome 85.0.4183.102

5 réponses

  1. 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
    1. @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 ! ;-)
      1. Contributeur
        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
        1. 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]
          
          1. Pas de quoi, par contre merci de mettre la discussion en 'résolue' du coup.

            A+