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
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
Salut,
Non ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part SELECT * FROM table WHERE rownum < 2 ORDER BY DESC DateRdv
Non. je veux uniquement la dernière date. donc je dois avoir une seule date pour chaque nom
Ah oui, je pensais que tu parlais d'une personne à la fois.
Peut-être avec un bon group by ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 select nom, max (dateRdv) from rdv group by nom;
justement comment ?Envoyé par KiLVaiDeN
Si tu veux SEULEMENT le dernier RDV pour chaque personne alors comme le disait KiLVaiDeN :
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, MAX(dateRDV) FROM MATABLE GROUP BY nom
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, poste, MAX(dateRDV) FROM MATABLE GROUP BY nom, poste
car MAX(typeRDV) ne te donnerai pas le type du dernier RDV mais le dernier type présent dans ta liste de RDV.
Code : Sélectionner tout - Visualiser dans une fenêtre à part SELECT nom, MAX(dateRDV), MAX(typeRDV) FROM MATABLE GROUP BY nom
EDIT :
Grillé par PlaineR
justement je suis exactement dans ce cas en effet j'ai besoin en plus du type de RDV du dernier rendez-vousMais si tu veux le type de RDV (disons que tu peux avoir 3 types, A,B et C) alors tu ne peux pas faire :
car MAX(typeRDV) ne te donnerai pas le type du dernier RDV mais le dernier type présent dans ta liste de RDV.
Code : Sélectionner tout - Visualiser dans une fenêtre à part SELECT nom, MAX(dateRDV), MAX(typeRDV) FROM MATABLE GROUP BY nom
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.Envoyé par KiLVaiDeN
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
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 ?
tu veux dire 2 select imbriqués dans ce cas. c'est ça ?
Avec un select imbriqué, ça donnerait ça :
Je parlais de la requête que j'ai mise, elle ne fonctionne pas ?
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 )
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
Super la solution PlaineR.
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
Et si par malheur dans le cas de doublons, un tri est nécessaire....
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 )
Exact, mais dans ce cas il y a plus simple , il suffit de ramener le max (ou le min) de typerdv :Envoyé par McM
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;
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;
Envoyé par laurentschneider
Juste une précision : cette syntaxe ne fonctionne qu'à partir de la 9i
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager