2010-05-29 148 views
1

嘿家伙,只是在查询时遇到了一些困难,我试图弄清楚如何显示在中心访问过的最受欢迎的自然景观。我的表格如下所示。sql查询问题

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 2010-05-29 09:24:02

+0

即时通讯使用sqlplus – bu0489 2010-05-29 09:29:24

回答

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

虽然这不会给自然疗法的名字是OP之后的。 – dalton 2010-05-29 10:14:23

+0

谢谢达尔顿,我已经更新了它。 – 2010-05-31 05:21:26

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 2010-05-29 09:31:56

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

是的 - 如果有一个领带的位置,这个查询挑第一个出现 – 2010-05-29 10:03:41