CREATE TABLE doctor( patient CHAR(13), docname CHAR(30) );
假设我有一张这样的桌子,那么我如何显示患者最多的医生的姓名?就好像最多的是三个,两个医生有三个病人,然后我会显示他们的名字。
这将得到最大的患者:
SELECT MAX(count)
FROM (SELECT COUNT(docname) FROM doctor GROUP BY docname) a;
这是所有医生和他们有多少病人:
SELECT docname, COUNT(docname) FROM doctor GROUP BY name;
现在我无法弄清楚如何将它们结合起来只列出拥有最大患者的医生的姓名。
感谢。
答案 0 :(得分:15)
这应该这样做。
SELECT docname, COUNT(*) FROM doctor GROUP BY name HAVING COUNT(*) =
(SELECT MAX(c) FROM
(SELECT COUNT(patient) AS c
FROM doctor
GROUP BY docname))
另一方面,如果您只需要第一个条目,那么
SELECT docname, COUNT(docname) FROM doctor
GROUP BY name
ORDER BY COUNT(docname) DESC LIMIT 1;
答案 1 :(得分:6)
这应该适合你:
SELECT docname
FROM doctor
GROUP BY docname
HAVING COUNT(patient)=
(SELECT MAX(patientcount) FROM
(SELECT docname,COUNT(patient) AS patientcount
FROM doctor
GROUP BY docname) t1)
答案 2 :(得分:3)
这是另一种只有一个子查询而不是两个子查询的替代方法:
SELECT docname
FROM author
GROUP BY name
HAVING COUNT(*) = (
SELECT COUNT(*) AS c
FROM author
GROUP BY name
ORDER BY c DESC
LIMIT 1
)
答案 3 :(得分:2)
允许任何ISO SQL规范中的任何功能,因为您没有指定数据库产品或版本,并假设患者表被称为“患者”并且有一个名为“docname”的列,以下可能会给您什么你想要的:
With PatientCounts As
(
Select docname
, Count(*) As PatientCount
From patient
Group By docname
)
, RankedCounts As
(
Select docname, PatientCount
, Rank() Over( Order By PatientCount ) As PatientCountRank
From PatientCounts
)
Select docname, PatientCount, PatientCountRank
From RankedCounts
Where PatientCountRank = 1
答案 4 :(得分:1)
同时获取两个查询并将它们连接在一起以获得最大值:
SELECT
docName,
m.MaxCount
FROM
author
INNER JOIN
(
SELECT
MAX(count) as MaxCount,
docName
FROM
(SELECT
COUNT(docname)
FROM
doctor
GROUP BY
docname
)
) m ON m.DocName = author.DocName
答案 5 :(得分:1)
使用... HAVING COUNT(*)=(... MAX()..)有效:
使用TOP / LIMIT / RANK等工作时:
另外,使用TOP / LIMIT为1只会给出一行 - 如果有两个或更多医生具有相同的最大患者数量会怎么样?
我会将问题分解为步骤:
获取目标字段和相关计数
SELECT docName, COUNT( patient ) AS countX
FROM doctor
GROUP BY docName
使用以上作为语句范围的视图',加入以获取最大计数行
WITH x AS
(
SELECT docName, COUNT( patient ) AS countX
FROM doctor
GROUP BY docName
)
SELECT x.docName, x.countX
FROM x
INNER JOIN
(
SELECT MAX( countX ) AS maxCountX
FROM x
) x2
ON x2.maxCountX = x.countX
WITH子句定义了一个'语句范围视图,有效地提供了可以在同一查询中重用的命名子查询。
JOIN匹配患者最大数量的行。
虽然使用语句作用域视图的此解决方案较长,但它是:
测试更容易,因为查询的某些部分可以独立运行。
它是自我记录,因为查询直接反映了要求 即语句范围视图列出目标字段和关联计数。
它是可扩展的,就好像需要其他条件或字段一样,这可以很容易地添加到语句范围视图中。 例如,在这种情况下,应该更改表结构以包含doctor-id作为主键字段,这应该是结果的一部分。
答案 6 :(得分:0)
使用CTE的另一种选择:
with cte_DocPatients
as
(
select docname, count(*) as patientCount
from doctor
group by docname
)
select docname, patientCount from
cte_DocPatients where
patientCount = (select max(patientCount) from cte_DocPatients)
答案 7 :(得分:0)
这将为您提供每位医生的姓名和各自治疗患者的人数
SELECT docname, COUNT(docname) as TreatingPatients FROM doctor
WHERE docname = docname
GROUP BY docname