2010-05-29 4 views
1

эй, ребята, просто немного затруднившись с запросом, я пытаюсь выяснить, как показать самый популярный naturopath, который был посещен в центре. Мои таблицы выглядят следующим образом:sql query question

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

и

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

теперь запросить это я придумал

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

что приводит;

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

Мой вопрос, как бы я идти о выборе самого высокого счета из этого списка, и печатать это значение с натуропатов именем? Любые предложения приветствуются,

+0

Вы используете Oracle или MySQL? Вы ввели теги для обоих: – Andomar

+0

im using sqlplus – bu0489

ответ

1

Вы можете использовать функцию RANK аналитической - это присвоить звание «1» в верхний натуропат, или натуропаты, если есть галстук за первое место:

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

Хотя это не даст Название Naturopath, на которое указывает OP. – dalton

+0

спасибо dalton, я обновил его. –

2

В MySQL, можно выбрать верхнюю строку как:

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 

Кстати, если вы проверяете для null вместо строки "NULL", попробуйте:

where naturopathno is not null 
+0

извините за теги, им пользуется oracle 10g – bu0489

0

хорошо понял это, спасибо, ребята, ив получил это, который делает работу, вероятно, не очень эффективно, но делает это сделать :)

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; 

любые лучшие способы сделать это?

+0

да - если есть галстук для верхнего места, этот запрос выбирает первый, который появляется –