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

Langage SQL Discussion :

Trouver date précédente


Sujet :

Langage SQL

  1. #1
    Candidat au Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Mai 2018
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2018
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Trouver date précédente
    Bonjour j'ai une table INVOICE avec un champ "facture" et un champ "date_facture". Pour chaque facture je souhaite connaitre la date de la facture précédente.


    Facture date_fact.
    FAC071 2014-01-08
    FAC082 2014-01-14
    FAC073 2014-01-15
    FAC094 2014-01-15
    FAC066 2014-01-15
    FAC055 2014-01-16
    FAC072 2014-01-16

    Ce que je veux pour chaque ligne c'est afficher la date de la facture précédente afin d'obtenir cela

    Facture date_fact. date précédente
    FAC071 2014-01-08 NULL
    FAC082 2014-01-14 2014-01-08
    FAC073 2014-01-15 2014-01-14
    FAC094 2014-01-15 2014-01-14
    FAC066 2014-01-15 2014-01-14
    FAC055 2014-01-16 2014-01-15
    FAC072 2014-01-16 2014-01-15


    J'ai essayé plein de choses avec des requêtes imbriquées mais sans succès. Si quelqu'un a la solution

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    montrez-nous déjà ce que vous avez essayé !
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  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
    Ce n'est pas si simple et il y a peu de SGBDR qui supporte cette syntaxe, pourtant dans la norme depuis très longtemps :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select Facture
         , date_fact
         , max(date_fact) over(order by date_fact range between unbounded preceding and interval '1' day preceding) as date_fact_prec
      from invoice;
    On peut récupérer le résultat avec une requête scalaire, ça fonctionnera un peu partout mais côté performance c'est pas terrible :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select c1.Facture
         , c1.date_fact
         , (select max(c2.date_fact) as date_fact_prec
              from invoice as c2
             where c2.date_fact < c1.date_fact)
      from invoice as c1;
    Ou avec le nouvel opérateur CROSS APPLY qui réagira mieux, mais qui souffre aussi côté implémentation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    select c1.Facture
         , c1.date_fact
         , c3.date_fact_prec
      from invoice as c1
    cross apply (select max(c2.date_fact) as date_fact_prec
                   from invoice as c2
                  where c2.date_fact < c1.date_fact) as c3;

  4. #4
    Candidat au Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Mai 2018
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2018
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Grand merci à Waldar le cross Apply est exactement ce que je recherchais. Pour les temps de réponse il me faut attendre la semaine prochaine pour mettre en place la requette sur une base client qui a de gros volumes mais déjà sur ma base de test cela fonctionne parfaitement.

    Encore merci pour la clarté de ton code et ta réactivité

  5. #5
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    Un LAG devrait aussi faire l'affaire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT 
    	   Facture
        ,   date_fact
        ,   LAG(date_fact) OVER(ORDER BY date_fact) AS DatePrecedente
    FROM Invoice

  6. #6
    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
    Pas tout à fait :
    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
    select Facture
         , date_fact
         , lag(date_fact) over(order by date_fact)                                                                  as date_fact_prec_lag
         , max(date_fact) over(order by date_fact range between unbounded preceding and interval '1' day preceding) as date_fact_prec_max
      from invoice;
     
    FACTURE DATE_FACT   DATE_FACT_PREC_LAG  DATE_FACT_PREC_MAX
    ------- ----------  ------------------  ------------------
    FAC071  2014-01-08
    FAC082  2014-01-14  2014-01-08          2014-01-08
    FAC073  2014-01-15  2014-01-14          2014-01-14
    FAC094  2014-01-15  2014-01-15          2014-01-14
    FAC066  2014-01-15  2014-01-15          2014-01-14
    FAC055  2014-01-16  2014-01-15          2014-01-15
    FAC072  2014-01-16  2014-01-16          2014-01-15

  7. #7
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    ha oui... bien vu !

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

Discussions similaires

  1. Trouver la date précédente
    Par AmineHba dans le forum Access
    Réponses: 3
    Dernier message: 07/06/2016, 09h41
  2. Extraire la date précédente disponible
    Par guidav dans le forum Langage SQL
    Réponses: 3
    Dernier message: 23/01/2008, 17h17
  3. Lecture du champ date précédent
    Par Philippe608 dans le forum VBA Access
    Réponses: 5
    Dernier message: 05/12/2007, 21h40
  4. [Requete]Faire un groupement sur une date précédente
    Par le_gueux90 dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 03/12/2007, 09h53
  5. PL/SQL TROUVER DATES DE PÂQUES, ASCENSION et PENTECôTE
    Par mimi_été dans le forum PL/SQL
    Réponses: 4
    Dernier message: 21/10/2004, 15h40

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