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

时间:2011-03-01 20:26:37

标签: sql group-by

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;

现在我无法弄清楚如何将它们结合起来只列出拥有最大患者的医生的姓名。

感谢。

8 个答案:

答案 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()..)有效:

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

使用TOP / LIMIT / RANK等工作时:

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

另外,使用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