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;
现在我不知道如何将它们组合起来以仅列出拥有最多患者的医生的姓名。
谢谢。
这应该可以。
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;
这应该适合你:
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)
这是另一种选择,只有一个子查询而不是两个:
SELECT docname
FROM author
GROUP BY name
HAVING COUNT(*) = (
SELECT COUNT(*) AS c
FROM author
GROUP BY name
ORDER BY c DESC
LIMIT 1
)
考虑到任何 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
使用 ... HAVING COUNT(*) = ( ...MAX().. ) 有效:
使用 TOP / LIMIT / RANK 等有效时:
此外,使用 TOP / LIMIT 为 1 只会给出一行 - 如果有两个或更多医生的患者最大数量相同怎么办?
我会将问题分解为几个步骤:
获取目标字段和关联计数
SELECT docName, COUNT( patient ) AS countX
FROM doctor
GROUP BY docName
使用上述内容作为 CTE(即语句范围视图),使用它来获取最大计数行
WITH x AS
(
SELECT docName, COUNT( patient ) AS countX
FROM doctor
GROUP BY docName
)
SELECT x.docName, x.countX
FROM x
WHERE x.countX = ( SELECT MAX( countX ) FROM x )
WITH 子句定义了 CTE,有效地提供了可以在同一查询中重复使用的命名子查询。
虽然这个使用 CTE 的解决方案更长,但它是:
测试更容易,因为查询的一部分可以独立运行。
它是自记录的,因为查询直接反映了需求 即 CTE 列出目标字段和相关计数。
它是可扩展的,就像需要其他条件或字段一样,可以轻松地将其添加到 CTE 中。 例如,在这种情况下,应更改表结构以包含医生 ID 作为主键字段,这应该是结果的一部分。
接受两个查询并将它们连接在一起以获得最大值:
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
使用 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)
如果您不需要关心性能,我认为只需排序并选择第一个元素即可。像这样的东西:
SELECT docname, COUNT(docname) as CNT
FROM doctor
WHERE docname = docname
GROUP BY docname
ORDER BY CNT DESC
LIMIT 1
这将为您提供每位医生的姓名以及各自治疗患者的数量
SELECT docname, COUNT(docname) as TreatingPatients FROM doctor
WHERE docname = docname
GROUP BY docname