2010-05-29 11 views
1

hey les gars, juste avoir un peu de difficulté avec une requête, j'essaie de comprendre comment montrer le naturopathe le plus populaire qui a été visité dans un centre. Mes tableaux ressemblent à ceci:sql question de question

Patient(patientId, name, gender, DoB, address, state,postcode, homePhone, businessPhone, maritalStatus, occupation, duration,unit, race, registrationDate , GPNo, NaturopathNo) 

et

Naturopath (NaturopathNo, name, contactNo, officeStartTime, officeEndTime, emailAddress) 

maintenant à interroger ce que je suis venu avec

SELECT count(*), naturopathno FROM dbf10.patient WHERE naturopathno != 'NULL' GROUP BY naturopathno; 

qui se traduit par;

COUNT(*) NATUROPATH 
    2 NP5 
    1 NP6 
    3 NP2 
    1 NP1 
    2 NP3 
    1 NP7 
    2 NP8 

Ma question est, comment pourrais-je aller sur la sélection du nombre le plus élevé de cette liste, et l'impression de cette valeur avec le nom naturopathes? Toutes les suggestions sont les bienvenues,

+0

Utilisez-vous Oracle ou MySQL? Vous avez entré des tags pour les deux :) – Andomar

+0

im utilisant sqlplus – bu0489

Répondre

1

Vous pouvez utiliser la fonction analytique RANK - ce assignera rang « 1 » à la plus haute naturopathe ou naturopathes s'il y a une égalité pour la première place:

SELECT (select name from Naturopath n 
     where n.NaturopathNo = q.naturopathno) 
     as TopNaturopathName, 
     ,q.patients 
FROM (
SELECT naturopathno, patients, 
     RANK() OVER (ORDER BY patients DESC) rnk 
FROM (
    SELECT COUNT(*) AS patients, naturopathno 
    FROM dbf10.patient 
    WHERE naturopathno is not null 
    GROUP BY naturopathno 
) 
) q 
WHERE rnk = 1; 
+0

Bien que cela ne donnerait pas le Nom du naturopathe que l'OP est après. – dalton

+0

merci dalton, je l'ai mis à jour. –

2

MySQL, vous pouvez sélectionner la rangée supérieure comme:

select * 
from Naturopath n 
join (
    SELECT count(*) as cnt, naturopathno 
    FROM dbf10.patient 
    WHERE naturopathno != 'NULL' 
    GROUP BY naturopathno; 
) pat ON pat.naturopathno = n.naturopathno 
ORDER BY pat.cnt DESC 
LIMIT 1 

Soit dit en passant, si vous vérifiez pour null au lieu de la chaîne "NULL", essayez:

where naturopathno is not null 
+0

désolé pour les tags, im en utilisant oracle 10g – bu0489

0

ok figured it out, merci les gars, Ive a obtenu ce qui fait le travail, probablement pas très efficace mais ne le faire :)

SELECT * 
FROM (
SELECT COUNT(*) AS patients, naturopathno 
FROM dbf10.patient 
WHERE naturopathno is not null 
GROUP BY naturopathno 
ORDER BY patients DESC) 
WHERE ROWNUM = 1; 

de meilleures façons de le faire?

+0

oui - s'il y a une cravate pour la première place, cette requête prend le premier qui apparaît –