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 :

requete avec jointure sur max(date)


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2004
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 30
    Points : 12
    Points
    12
    Par défaut requete avec jointure sur max(date)
    Bonjour,

    Admettons les 3 tables suivantes :

    dossier
    id nom
    1 Mme Michu
    2 M Dupont

    intervention
    id dossier_id Date
    1 1 2022-06-01
    2 2 2022-06-02
    3 2 2022-06-03

    intervention_cloture
    id intervention_id Date
    1 1 2022-06-02
    2 3 2022-06-04

    Un dossier peut porter o ou n interventions.
    Une intervention n'est pas nécessairement clôturée avant d'en ouvrir une autre.

    Je souhaite récupérer tous les dossiers ainsi que la dernière intervention en date non clôturée.
    Ce qui devrait me donner :

    dossier.id dossier.nom intervention.id intervention.date intervention_cloture.date
    2 M Dupont 2 2022-06-02 null

    Une âme charitable peut m'aider à rédiger la requête ad hoc ?

    Merci à vous

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Bonjour,
    Pour moi il faut procéder en deux phase:
    1. Recherche des interventions non clôturées.
    C'est assez simple ici, il s'agit de partir des dossiers, de faire une jointure sur les interventions (INNER JOIN), puis de vérifier qu'il n'existe pas de ligne dans intervention_cloture qui corresponde.
    Tu peux par exemple utilise une jointure externe, un not exists...

    2. Recherche de la dernière intervention
    Une fois le premier point réglé, escartefigue nous a rédigé un article concernant la recherche du premier/dernier... qui est un sujet assez récurrent.

    Tatayo.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2004
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 30
    Points : 12
    Points
    12
    Par défaut
    Bonjour Tatayo, et merci pour ta réponse.

    La première partie semble effectivement relativement simple, qqch du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    select 
            dossier.id,
            dossier.nom,
            intervention.id,
            intervention.date
    from dossier
    join intervention
            on dossier.id = intervention.dossier_id
    where not exists
            (select 1 from intervention_cloture where intervention_cloture.cloture_id = intervention.id)
    devrait permettre d'isoler les couples dossiers/interventions non cloturés.

    En revanche, j'ai beau regarder l'excellent article que tu suggères, je reste désespérément nul pour la suite

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Quel est le SGBD (et la version) utilisé ?
    Suivant le moteur, tu peux utiliser une CTE et une fonction OLAP pour ça:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    With inter as
    (
    select 
            dossier.id,
            dossier.nom,
            intervention.id,
            intervention.date,
    rank over(partition by dossier.id order by intervention.date desc) as rang
    from dossier
    join intervention
            on dossier.id = intervention.dossier_id
    where not exists
            (select 1 from intervention_cloture where intervention_cloture.cloture_id = intervention.id)
    )
    select * from inter
    where rang = 1

    Tatayo.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2004
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 30
    Points : 12
    Points
    12
    Par défaut
    Mariadb en version 10.5, donc à priori compatible CTE et OLAP ?
    Je test ça, merci beaucoup !

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2004
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 30
    Points : 12
    Points
    12
    Par défaut
    Je confirme, cela fonctionne !
    Merci beaucoup pour ton aide et pour m'avoir appris ces fonctions qui vont probablement me servir dans bien d'autres cas !

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

Discussions similaires

  1. Requete avec condition sur une date
    Par Romain0 dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 23/02/2012, 10h49
  2. [Vxi] Auto-jointure sur max date
    Par Burt67 dans le forum Designer
    Réponses: 2
    Dernier message: 02/02/2011, 16h52
  3. Requete avec jointure sur la même table
    Par CaptainChoc dans le forum Langage SQL
    Réponses: 3
    Dernier message: 21/04/2009, 12h30
  4. Besoin d'aide sur une requete avec jointure et MAX()
    Par droog dans le forum Requêtes
    Réponses: 4
    Dernier message: 04/07/2007, 18h23
  5. requete avec filtre sur la date
    Par petitours dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 12/02/2007, 11h49

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