2011-03-01 66 views
6
CREATE TABLE doctor(patient CHAR(13), docname CHAR(30)); 

假設我有這樣一張桌子,那麼我如何顯示病人最多的醫生的名字?如果最多的是三個,兩個醫生有三個病人,那麼我會顯示他們的兩個名字。SQL - 顯示計數最大的條目?

這會得到最大的患者:

SELECT MAX(count) 
FROM (SELECT COUNT(docname) FROM doctor GROUP BY docname) a; 

這是所有的醫生,他們有多少病人有:

SELECT docname, COUNT(docname) FROM doctor GROUP BY name; 

現在我無法弄清楚如何將它們結合起來,列出只有擁有最大患者的醫生的姓名。

謝謝。

+3

什麼數據庫產品和版本? – Thomas 2011-03-01 20:30:53

+0

@Thomas建議,如果不知道我們正在使用哪個數據庫,很難提供幫助。 – 2011-03-01 20:32:13

+1

你把你的病人名字命名爲「作者」? 「病人」表的模式是什麼樣的? – Thomas 2011-03-01 20:33:29

回答

0

採取查詢和它們連接起來,以獲得最大:

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 
4

這應該爲你做它:

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) 
+0

我非常喜歡這一款。這更像是我想要做的,除了我在使用where子句。我只是無法完全正確地獲得格式。 – Stewage 2011-03-01 20:42:01

2

下面是隻有一個子查詢,而不是兩個另一種選擇:

SELECT docname 
FROM author 
GROUP BY name 
HAVING COUNT(*) = (
    SELECT COUNT(*) AS c 
    FROM author 
    GROUP BY name 
    ORDER BY c DESC 
    LIMIT 1 
) 
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 
11

這應該這樣做。

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; 
0

在使用... HAVING COUNT(*)=(... MAX()..)工作原理:

  • 在查詢中,它需要幾乎相同的子查詢兩次。
  • 對於大多數數據庫,它需要二級子查詢MAX(COUNT(*)) 不支持。

在使用TOP/LIMIT/RANK等作品:

  • 它使用SQL擴展爲一個特定的數據庫。

另外,使用1的TOP/LIMIT只會給出一行 - 如果有兩個或更多的醫生具有相同的最大患者數量,該怎麼辦?

我將問題分解成以下步驟:

獲取目標區域(S)和相關的計數

SELECT docName, COUNT(patient) AS countX 
FROM doctor 
GROUP BY docName 

使用上面的「聲明範圍的觀點」,加入以獲得max count row(s)

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子句,它定義了一個'語句sco ped view「,有效地給出了可以在同一查詢中重新使用的命名子查詢。

JOIN與患者的最大計數行匹配。

雖然這種解決方案,使用的語句範圍的意見,是更長的時間,它是:

  • 更容易測試
  • 自我記錄
  • 可擴展

它是更容易測試的零件的查詢可以獨立運行。

這是自我記錄,因爲查詢直接反映了要求 即語句作用域視圖列出了目標字段和關聯的計數。

它可擴展,就好像其他條件或字段是必需的,這可以很容易地添加到語句作用域視圖。 例如,在這種情況下,應該更改表格結構以包含doctor-id作爲主鍵字段,這應該是結果的一部分。

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)