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 :

min(date) pour chaque patient


Sujet :

Langage SQL

  1. #1
    Membre averti
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    321
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 321
    Points : 360
    Points
    360
    Par défaut min(date) pour chaque patient
    Bonjour,

    Je bloque depuis maintenant un tres gros moment sur une requete qui au depart ne me semblait pas bien compliquée...
    Voici ma table
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    IDPatient         Profil            Datemodif
    1                 profil 1          04/05/2005
    1                 profil 4          05/05/2005
    1                 profil 2          06/05/2005
    2                 profil 1          05/05/2005 
    2                 profil 3          10/05/2005
    4                 profil 2          08/05/2005
    4                 profil 1          12/05/2005
    4                 profil 3          13/05/2005
    4                 profil 4          20/05/2005
    Je souhaite recuperer pour chaque patient le tuple complet correspondant à la premiere date. Le resultat escompté sur l'exemple est donc

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    IDPatient         Profil            Datemodif
    1                 profil 1          04/05/2005
    2                 profil 1          05/05/2005 
    4                 profil 2          08/05/2005
    Avez vous une piste qui pourrait m'aider : je pense que la requete en elle meme ne doit pas etre compliquée mais je dois passer a coté d'une notion ...
    edit : dans le resultat la troisieme colone m'importe peu, l'important est d'avoir pour chaque patient le profil qui a été suivi en premier chronologiquement

    Aurélien

  2. #2
    Membre confirmé Avatar de chrifo
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    444
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 444
    Points : 481
    Points
    481
    Par défaut
    Bonjour,
    Voilà deux solutions possibles, quel est votre SGBD ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT DISTINCT
      IDPATIENT,
      first_value(Profil) over(PARTITION BY IDPATIENT ORDER BY Datemodif) AS Profil,
      first_value(Datemodif) over(PARTITION BY IDPATIENT ORDER BY Datemodif) AS Datemodif
    FROM ma_table
    ou bien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT ma_table.* 
      FROM
        (SELECT IDPatient, MIN(Datemodif) AS Datemodif FROM ma_table GROUP BY IDPatient) sel_date
    	inner join ma_table ON sel_date.IDPatient = ma_table.IDPatient AND sel_date.Datemodif = ma_table.Datemodif
    Je penche, donc je suis

  3. #3
    Membre averti
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    321
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 321
    Points : 360
    Points
    360
    Par défaut
    Bonjour,

    Excusez moi effectivement j'ai oublié de preciser le sgbd utilisé : sqlserver 2000
    Je vais tester cela.

  4. #4
    Membre averti
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    321
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 321
    Points : 360
    Points
    360
    Par défaut
    J'ai eu quelques soucis pour dapater ces requets pour sqlserver mais je suis qd meme arrivé au résultat :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    select distinct idpatient, profil
    from ma_table
    where datemodif in
                             (select min(datemodif) 
                             from ma_table 
                             group by idpatient)

  5. #5
    Membre confirmé Avatar de chrifo
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    444
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 444
    Points : 481
    Points
    481
    Par défaut
    ?? Avec votre jeu de test, cette requete ne vous renvoie-t-elle pas 2 lignes pour le patient 1 ?

    sous SQL Server 2000, il me semble que celle ci devrait fonctionner :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT ma_table.* 
      FROM
        (SELECT IDPatient, MIN(Datemodif) AS Datemodif FROM ma_table GROUP BY IDPatient) as sel_date,
        ma_table 
      WHERE
        sel_date.IDPatient = ma_table.IDPatient 
        AND sel_date.Datemodif = ma_table.Datemodif
    Je penche, donc je suis

  6. #6
    Membre averti
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    321
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 321
    Points : 360
    Points
    360
    Par défaut
    merci encore de votre aide. Je vais tester cette nouvelle requete . Celle que j'ai posté au dessus fonctionne correctement et ne renvoit pas deux lignes pour le premier patient (j'ai fait la verification : on est jamais trop prudent)

  7. #7
    Membre confirmé Avatar de chrifo
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    444
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 444
    Points : 481
    Points
    481
    Par défaut
    Citation Envoyé par leyee Voir le message
    Celle que j'ai posté au dessus fonctionne correctement et ne renvoit pas deux lignes pour le premier patient
    Ca m'étonne, elle devrait renvoyer deux lignes pour le premier patient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT MIN(datemodif) 
                             FROM ma_table 
                             GROUP BY idpatient
    retourne "04/05/2005", "05/05/2005" et "08/05/2005", or le patient 1 a des profils daté "04/05/2005" et "05/05/2005".

    Il n'y a pas de jointure sur l'IDPatient avec cette sous-requete, la requête est donc incorrecte.
    Je penche, donc je suis

Discussions similaires

  1. Réponses: 3
    Dernier message: 04/07/2012, 13h33
  2. manipulation de date pour chaque jour du mois
    Par renardchan dans le forum Requêtes
    Réponses: 3
    Dernier message: 09/06/2011, 22h00
  3. Réponses: 7
    Dernier message: 05/10/2010, 11h19
  4. Réponses: 1
    Dernier message: 15/08/2010, 16h03
  5. Réponses: 16
    Dernier message: 03/06/2009, 05h14

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