IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SQL Oracle Discussion :

Création un intervalle de date par rapport aux dates de mise à jour


Sujet :

SQL Oracle

  1. #1
    Membre à l'essai
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Août 2021
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Santé

    Informations forums :
    Inscription : Août 2021
    Messages : 9
    Points : 11
    Points
    11
    Par défaut Création un intervalle de date par rapport aux dates de mise à jour
    Bonjour,

    J'ai une table d'historisation des changements de tarifs des produits.
    je souhaiterais créer une requête SQL / vue sous oracle en mettant la valeur du produit et les dates de validations par rapport aux dates de mise à jour.
    Ci dessous un exemple :

    DATE MAJ ID_PR VALEUR
    06/06/17 A067 42
    06/06/17 A070 95,2
    11/02/11 A091 45
    06/06/17 A091 1337
    11/02/11 A092 45
    06/06/17 A092 33,6
    11/02/11 A093 45
    06/06/17 A093 33,6
    11/02/11 A094 45
    11/02/11 A095 45
    06/06/17 A095 56

    le résultat souhaité :

    DATE MAJ ID_PR VALEUR DATE DEBUT DATE FIN
    06/06/17 A067 42 06/06/17 SYSDATE + 1
    06/06/17 A070 95,2 06/06/17 SYSDATE + 1
    11/02/11 A091 45 11/02/11 06/06/17 - 1
    06/06/17 A091 1337 06/06/17 SYSDATE + 1
    11/02/11 A092 45 11/02/11 06/06/17 - 1
    06/06/17 A092 33,6 06/06/17 SYSDATE + 1
    11/02/11 A093 45 11/02/11 06/06/17 - 1
    06/06/17 A093 33,6 06/06/17 SYSDATE + 1
    11/02/11 A094 45 11/02/11 SYSDATE + 1
    11/02/11 A095 45 11/02/11 06/06/17 - 1
    06/06/17 A095 56 06/06/17 SYSDATE + 1

    Date de début : c'est la date du mise à jour
    Date de fin :
    Pour la dernière MAJ c'est la date de jour +1
    Pour autres lignes : C'est la date de la MAJ qui suit -1.

    je vous remercie par avance de votre aide précieuse.

    Amine

  2. #2
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    Avec les fonctions analytiques, c'est simple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    with matable as (select to_date('06/06/17', 'DD/MM/RR') datemaj, 'A067' IDPR, 42 valeur FROM DUAL 
    union all select to_date('06/06/17', 'DD/MM/RR') datemaj, 'A070' IDPR, 95.2 valeur FROM DUAL 
    union all select to_date('11/02/11', 'DD/MM/RR') datemaj, 'A091' IDPR, 45 valeur FROM DUAL 
    union all select to_date('06/06/17', 'DD/MM/RR') datemaj, 'A091' IDPR, 1337 valeur FROM DUAL 
    union all select to_date('11/02/11', 'DD/MM/RR') datemaj, 'A092' IDPR, 45 valeur FROM DUAL 
    union all select to_date('06/06/17', 'DD/MM/RR') datemaj, 'A092' IDPR, 33.6 valeur FROM DUAL 
    union all select to_date('11/02/11', 'DD/MM/RR') datemaj, 'A093' IDPR, 45 valeur FROM DUAL 
    union all select to_date('06/06/17', 'DD/MM/RR') datemaj, 'A093' IDPR, 33.6 valeur FROM DUAL 
    union all select to_date('11/02/11', 'DD/MM/RR') datemaj, 'A094' IDPR, 45 valeur FROM DUAL 
    union all select to_date('11/02/11', 'DD/MM/RR') datemaj, 'A095' IDPR, 45 valeur FROM DUAL 
    union all select to_date('06/06/17', 'DD/MM/RR') datemaj, 'A095' IDPR, 56	 valeur FROM DUAL 
    )
    select idPR, datemaj, valeur, NVL((lead(datemaj, 1) over (partition by idpr order by datemaj)) - 1, TRUNC(SYSDATE)+1) Fin
    from matable
    order by idPR, datemaj
    Résultat

    IDPR DATEMAJ VALEUR FIN
    A067 06/06/2017 42 15/09/2021
    A070 06/06/2017 95.2 15/09/2021
    A091 11/02/2011 45 05/06/2017
    A091 06/06/2017 1337 15/09/2021
    A092 11/02/2011 45 05/06/2017
    A092 06/06/2017 33.6 15/09/2021
    A093 11/02/2011 45 05/06/2017
    A093 06/06/2017 33.6 15/09/2021
    A094 11/02/2011 45 15/09/2021
    A095 11/02/2011 45 05/06/2017
    A095 06/06/2017 56 15/09/2021
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  3. #3
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Je ne suis pas fan du NVL sur le lead, alors que le troisième paramètre est là justement pour gérer les sorties de fenêtre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      select idPR
           , datemaj
           , valeur
           , lead(datemaj - 1, 1, trunc(sysdate) + 1) over (partition by idPR order by datemaj asc) as Fin
        from matable
    order by idPR, datemaj;
    Je pinaille bien entendu car un null sur la datemaj rend toute la logique bancale.

  4. #4
    Membre à l'essai
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Août 2021
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Santé

    Informations forums :
    Inscription : Août 2021
    Messages : 9
    Points : 11
    Points
    11
    Par défaut
    Bonjour,

    c'est parfait, ça répond exactement à ce que je cherche.
    je vous remercie pour votre aide

    Amine

  5. #5
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Merci Waldar, c'est un paramètre que je ne connaissais pas.
    Et merci à Winjerome pour le passage en tableau, faudra que je vois comment faire
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. ordonner les parents par rapport aux dates des children
    Par fphenix dans le forum Requêtes
    Réponses: 4
    Dernier message: 11/03/2011, 13h29
  2. Trier un tableau par rapport aux dates
    Par charline33 dans le forum Macros et VBA Excel
    Réponses: 19
    Dernier message: 21/04/2009, 09h58
  3. Réponses: 4
    Dernier message: 16/01/2008, 10h08
  4. realiser un tri par rapport aux dates
    Par le_viet dans le forum Général VBA
    Réponses: 3
    Dernier message: 24/04/2007, 15h05
  5. [Choix] Quelles attentes par rapport aux SGBD ?
    Par thierry34 dans le forum Décisions SGBD
    Réponses: 6
    Dernier message: 13/07/2002, 20h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo