SQL - 显示计数最大值的条目?

问题描述 投票:0回答:9
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;

现在我不知道如何将它们组合起来以仅列出拥有最多患者的医生的姓名。

谢谢。

sql group-by
9个回答
31
投票

这应该可以。

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;

12
投票

这应该适合你:

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)

6
投票

这是另一种选择,只有一个子查询而不是两个:

SELECT docname
FROM author
GROUP BY name
HAVING COUNT(*) = (
    SELECT COUNT(*) AS c
    FROM author
    GROUP BY name
    ORDER BY c DESC
    LIMIT 1
)

4
投票

考虑到任何 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
投票

使用 ... HAVING COUNT(*) = ( ...MAX().. ) 有效:

  • 在查询内,需要两次几乎相同的子查询。
  • 对于大多数数据库,它需要一个二级子查询 MAX( COUNT(*) ) 不支持。

使用 TOP / LIMIT / RANK 等有效时:

  • 它对特定数据库使用 SQL 扩展。

此外,使用 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 作为主键字段,这应该是结果的一部分。


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 

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)

0
投票

如果您不需要关心性能,我认为只需排序并选择第一个元素即可。像这样的东西:

SELECT docname, COUNT(docname) as CNT 
FROM doctor 
WHERE docname = docname 
GROUP BY docname
ORDER BY CNT DESC
LIMIT 1

-1
投票

这将为您提供每位医生的姓名以及各自治疗患者的数量

SELECT docname, COUNT(docname) as TreatingPatients FROM doctor
WHERE docname = docname
GROUP BY docname
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.