假設你有「汽車總動員」的表幾十萬行, 和你想要做一個GROUP BY:T-SQL GROUP BY和COUNT,然後包括MAX從COUNT
SELECT CarID
, CarName
, COUNT(*) AS Total
FROM dbo.tbl_Cars
GROUP BY CarID
, CarName
該分組會給你帶來類似於:
CarID CarName Total
1872 Olds 202,121
547841 BMW 175,298
9877 Ford 10,241
一切都很好。 我的問題,但是,是什麼東西拿到 總計和MAX總到一個表,在性能和 清潔編碼方面的最佳方式,讓你有這樣的結果:
CarID CarName Total Max Total
1872 Olds 202,121 202,121
547841 BMW 175,298 202,121
9877 Ford 10,241 202,121
一種方法將GROUP結果放入臨時表 ,然後將臨時表中的MAX讀入局部變量。 但我想知道做到這一點的最佳方法是什麼。
UPDATE
的公共表表達式似乎是最優雅的編寫, 但類似@EBarr,我有限的測試表明一個顯著降低性能。 所以我不會和CTE一起去。
由於@EBarr對COMPUTE
選項的鏈接表示功能 已被棄用,它似乎也不是最佳路線。
MAX值的局部變量選項和使用 臨時表可能是我下降的路線,因爲我不是 意識到它的性能問題。
有關我的用例的更多細節:它可能最終會成爲其他SO問題的一系列問題。但足以說,我正在將一大部分數據加載到臨時表中(因此tbl_Cars的一個子集是 進入#tbl_Cars,甚至#tbl_Cars可能會被進一步過濾 並對其執行聚合),因爲我必須在單個存儲的proc 內對其執行多個篩選 和聚合查詢,該查詢返回多個結果集。
更新2
@ EBarr的使用窗口函數的是好的和短。自我註釋: 如果將RIGHT JOIN
用於外部參照表,則函數應從tbl_Cars中選擇一列,而不是從'*'
中選擇一列。
SELECT M.MachineID
, M.MachineType
, COUNT(C.CarID) AS Total
, MAX(COUNT(C.CarID)) OVER() as MaxTotal
FROM dbo.tbl_Cars C
RIGHT JOIN dbo.tbl_Machines M
ON C.CarID = M.CarID
GROUP BY M.MachineID
, M.MachineType
在速度方面,看起來很好,但在什麼時候,你必須要 擔心的讀取次數?
你不能在索引視圖中使用'MAX'(我一直要求5年 - http://connect.microsoft.com/SQLServer/feedback/details/267516/expand-aggregate-support-in-indexed-views-min-max)。 'theFieldBeingSearchedForMax'不在表中,它是輸出的一部分(這是最高的計數)。 – 2012-02-09 19:41:33
只需重新閱讀問題。我錯讀了它。更新SQL。 – EBarr 2012-02-09 19:42:58
- 抱歉,我未能在第一個查詢中添加GROUP BY;我的錯。 – mg1075 2012-02-09 19:52:20