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

Ste*_*age 15 sql group-by

CREATE TABLE doctor( patient CHAR(13), docname CHAR(30) );
Run Code Online (Sandbox Code Playgroud)

假设我有这样一张桌子,那么我如何显示患者最多的医生的名字?就像最多的是三个,两个医生有三个病人,然后我会显示他们的两个名字.

这将获得最大的患者:

SELECT MAX(count) 
FROM (SELECT COUNT(docname) FROM doctor GROUP BY docname) a;
Run Code Online (Sandbox Code Playgroud)

这是所有医生和他们有多少患者:

SELECT docname, COUNT(docname) FROM doctor GROUP BY name;
Run Code Online (Sandbox Code Playgroud)

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

谢谢.

man*_*h_s 22

这应该做到这一点.

SELECT docname, COUNT(*) FROM doctor GROUP BY name HAVING COUNT(*) = 
    (SELECT MAX(c) FROM
        (SELECT COUNT(patient) AS c
         FROM doctor
         GROUP BY docname))
Run Code Online (Sandbox Code Playgroud)

另一方面,如果您只需要第一个条目,那么

SELECT docname, COUNT(docname) FROM doctor 
GROUP BY name 
ORDER BY COUNT(docname) DESC LIMIT 1;
Run Code Online (Sandbox Code Playgroud)

  • 第一个真的很简洁。我必须习惯以这种心态思考。一次“组合”一个事物:首先计算每组的计数,然后获取总体的最大值,然后再次分组并查找计数等于最大值的行。好的。 (2认同)

squ*_*man 9

这应该为你做:

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)
Run Code Online (Sandbox Code Playgroud)


Mar*_*ers 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
)
Run Code Online (Sandbox Code Playgroud)

  • 很抱歉复活了 8 年前的帖子,但是如果多个医生的患者最大数量相同怎么办?这不会只返回第一个吗? (2认同)

Jon*_*onH 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 
Run Code Online (Sandbox Code Playgroud)