Transformation de structure de table

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

5 réponses

  1. Reivax962 Messages postés 3742 Statut Membre 1 011
     
    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
    0
  2. Najac
     
    @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 ! ;-)
    0
  3. 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
    0
  4. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  5. Najac
     
    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]
    
    0
    1. RV71 Messages postés 620 Date d'inscription   Statut Membre Dernière intervention   31
       
      Pas de quoi, par contre merci de mettre la discussion en 'résolue' du coup.

      A+
      0