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

Oracle Discussion :

select sur la dernière date


Sujet :

Oracle

  1. #1
    Membre habitué
    Inscrit en
    Août 2006
    Messages
    181
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 181
    Points : 166
    Points
    166
    Par défaut select sur la dernière date
    Bonjour à tous,

    j'ai une table de RDV avec la colonne nom et colonne DateRdv. chaque nom peut avoir plusieurs RDV comment selectionner pour chaque nom le dernier RDV (la dernière date) ?

    Merci

  2. #2
    Membre expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 863
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 863
    Points : 3 444
    Points
    3 444
    Par défaut
    Salut,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM table WHERE rownum < 2 ORDER BY DESC DateRdv
    Non ?

  3. #3
    Membre habitué
    Inscrit en
    Août 2006
    Messages
    181
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 181
    Points : 166
    Points
    166
    Par défaut
    Non. je veux uniquement la dernière date. donc je dois avoir une seule date pour chaque nom

  4. #4
    Membre expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 863
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 863
    Points : 3 444
    Points
    3 444
    Par défaut
    Ah oui, je pensais que tu parlais d'une personne à la fois.

    Peut-être avec un bon group by ?

  5. #5
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select nom, max (dateRdv)
    from rdv
    group by nom;

  6. #6
    Membre habitué
    Inscrit en
    Août 2006
    Messages
    181
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 181
    Points : 166
    Points
    166
    Par défaut
    Citation Envoyé par KiLVaiDeN
    Peut-être avec un bon group by ?
    justement comment ?

  7. #7
    Membre émérite Avatar de nuke_y
    Profil pro
    Indépendant en analyse de données
    Inscrit en
    Mai 2004
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant en analyse de données

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 076
    Points : 2 370
    Points
    2 370
    Par défaut
    Si tu veux SEULEMENT le dernier RDV pour chaque personne alors comme le disait KiLVaiDeN :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT nom, MAX(dateRDV) FROM MATABLE GROUP BY nom
    Là où ça devient problèmatique c'est si tu veux d'autres informations qui peuvent varier avec le RDV. Par exemple si tu veux le poste de la personne qui prend RDV aucun problème :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT nom, poste, MAX(dateRDV) FROM MATABLE GROUP BY nom, poste
    Mais si tu veux le type de RDV (disons que tu peux avoir 3 types, A,B et C) alors tu ne peux pas faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT nom, MAX(dateRDV), MAX(typeRDV) FROM MATABLE GROUP BY nom
    car MAX(typeRDV) ne te donnerai pas le type du dernier RDV mais le dernier type présent dans ta liste de RDV.

    EDIT :
    Grillé par PlaineR

  8. #8
    Membre habitué
    Inscrit en
    Août 2006
    Messages
    181
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 181
    Points : 166
    Points
    166
    Par défaut
    Mais si tu veux le type de RDV (disons que tu peux avoir 3 types, A,B et C) alors tu ne peux pas faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT nom, MAX(dateRDV), MAX(typeRDV) FROM MATABLE GROUP BY nom
    car MAX(typeRDV) ne te donnerai pas le type du dernier RDV mais le dernier type présent dans ta liste de RDV.
    justement je suis exactement dans ce cas en effet j'ai besoin en plus du type de RDV du dernier rendez-vous

  9. #9
    Membre expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 863
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 863
    Points : 3 444
    Points
    3 444
    Par défaut
    Et bien tu peux faire ceci dans ce cas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT nom, MAX(dateRDV), typeRDV FROM MATABLE GROUP BY nom

  10. #10
    Membre habitué
    Inscrit en
    Août 2006
    Messages
    181
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 181
    Points : 166
    Points
    166
    Par défaut
    Citation Envoyé par KiLVaiDeN
    Et bien tu peux faire ceci dans ce cas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT nom, MAX(dateRDV), typeRDV FROM MATABLE GROUP BY nom
    non.
    cela donne le MAX(dateRDV) par typeRDV pour chaque personne. donc on va avoir 2 lignes ou plus pour chaque personne s'il y a plusieurs typeRDV

  11. #11
    Membre expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 863
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 863
    Points : 3 444
    Points
    3 444
    Par défaut
    Désolé, je suis dans les vappes aujourd'hui... Mais pour moi un max avec ta date ne va te retourner qu'un seul enregistrement par nom, celui correspondant au dernier rdv, ou je me trompe ?

    GROUP BY : regroupe tes lignes, par nom
    MAX : ne prend que l'enreg avec la date maximum ( du coup il n'y a qu'une seule ligne )
    SELECT nom, typeRDV : récupère les infos correspondantes pour cette ligne, donc un seul typeRDV

    J'ai faux ?

  12. #12
    Membre habitué
    Inscrit en
    Août 2006
    Messages
    181
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 181
    Points : 166
    Points
    166
    Par défaut
    tu veux dire 2 select imbriqués dans ce cas. c'est ça ?

  13. #13
    Membre expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 863
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 863
    Points : 3 444
    Points
    3 444
    Par défaut
    Avec un select imbriqué, ça donnerait ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Select nom, typeRdv, dateRDV from table where idrdv in ( select idrdv from table where nom = 'tonnom' and rownum < 2 order by dateRDV desc )
    Je parlais de la requête que j'ai mise, elle ne fonctionne pas ?

  14. #14
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    Non KiLVaiDeN, ta solution ne fonctionne pas, car le rownum est calculé avant l'order by

    Voici ce que je propose :
    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
    16
    17
    18
    19
    SQL> select * from rdv order by nom, daterdv;
    NOM                            DATERDV     TYPERDV
    ------------------------------ --------- ---------
    a                              29-OCT-06         1
    a                              29-OCT-06         2
    a                              30-OCT-06         1
    a                              30-OCT-06         2
    b                              30-OCT-06         1
    b                              30-OCT-06         2
    b                              31-OCT-06         0
    c                              29-OCT-06         1
    8 rows selected.
     
    SQL> select nom, daterdv, typerdv from rdv where (nom, daterdv) in (select nom, max(daterdv) from rdv group by nom);
    NOM                            DATERDV     TYPERDV
    ------------------------------ --------- ---------
    a                              30-OCT-06         2
    b                              31-OCT-06         0
    c                              29-OCT-06         1

  15. #15
    Membre expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 863
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 863
    Points : 3 444
    Points
    3 444
    Par défaut
    Je savais pas
    Merci pour l'info

  16. #16
    Membre émérite Avatar de nuke_y
    Profil pro
    Indépendant en analyse de données
    Inscrit en
    Mai 2004
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant en analyse de données

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 076
    Points : 2 370
    Points
    2 370
    Par défaut
    Super la solution PlaineR.

  17. #17
    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
    Oui, mais ATTENTION, si le tuple (nom, daterdv) n'est pas unique pour la date max, ça va ramener plusieurs lignes.
    Il faut dans le cas où l'on ne veut qu'une seule ligne arbitrairement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT *
    FROM RDV a1
    WHERE (col1_pk, col2_pk...) 
    	IN (SELECT col1_pk, col2_pk...
    		FROM RDV a2
    		WHERE nom = a1.nom
    		AND daterdv = (SELECT MAX(daterdv)
    				FROM RDV
    				WHERE nom = a1.nom
    			)
    		AND ROWNUM = 1
    		)
    Et si par malheur dans le cas de doublons, un tri est nécessaire....

  18. #18
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    Citation Envoyé par McM
    Oui, mais ATTENTION, si le tuple (nom, daterdv) n'est pas unique pour la date max, ça va ramener plusieurs lignes.
    Il faut dans le cas où l'on ne veut qu'une seule ligne arbitrairement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT *
    FROM RDV a1
    WHERE (col1_pk, col2_pk...) 
    	IN (SELECT col1_pk, col2_pk...
    		FROM RDV a2
    		WHERE nom = a1.nom
    		AND daterdv = (SELECT MAX(daterdv)
    				FROM RDV
    				WHERE nom = a1.nom
    			)
    		AND ROWNUM = 1
    		)
    Et si par malheur dans le cas de doublons, un tri est nécessaire....
    Exact, mais dans ce cas il y a plus simple , il suffit de ramener le max (ou le min) de typerdv :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT nom, daterdv, max (typerdv) 
    FROM rdv 
    WHERE (nom, daterdv) IN (SELECT nom, max(daterdv) FROM rdv GROUP BY nom) 
    group by nom, daterdv;

  19. #19
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT nom, MAX(dateRDV), 
      MAX(typeRDV)  keep (dense_rank first order by dateRDV desc)
    FROM MATABLE
    GROUP BY nom;

  20. #20
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    Citation Envoyé par laurentschneider
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT nom, MAX(dateRDV), 
      MAX(typeRDV)  keep (dense_rank first order by dateRDV desc)
    FROM MATABLE
    GROUP BY nom;


    Juste une précision : cette syntaxe ne fonctionne qu'à partir de la 9i

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 7
    Dernier message: 03/05/2012, 16h10
  2. [Drupal] Sélection sur un champ date
    Par ngpub dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 0
    Dernier message: 31/03/2010, 09h46
  3. Select sur un max date, compliqué..
    Par shadeoner dans le forum SQL
    Réponses: 7
    Dernier message: 04/11/2009, 11h16
  4. select sur une date de plus de x jour
    Par Zen_Fou dans le forum Requêtes
    Réponses: 4
    Dernier message: 03/04/2006, 17h14
  5. Problème de select sur une date (DATETIME....)
    Par zeldoi5 dans le forum Langage SQL
    Réponses: 7
    Dernier message: 16/05/2005, 11h19

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