[英]Get Max Count SQL
我缺少一些簡單的東西,但我不太清楚。
我基本上需要獲取列的最大計數。
SELECT
S.Type AS Type,
S.Version,
COUNT(R.FK_StoveNbr) AS TimesRepaired
FROM STOVE AS S
FULL JOIN STOVE_REPAIR AS R
ON S.SerialNumber = R.FK_StoveNbr
GROUP BY S.Type, S.Version
ORDER BY TimesRepaired DESC;
這為我提供了我需要的信息,但是現在我需要進行設置,因此它只顯示COUNT(R.FK_StoveNbr)中編號最大的Type。
一些信息:
[STOVE_REPAIR](
[RepairNbr] [int] NOT NULL,
[FK_StoveNbr] [int] NOT NULL,
[RepairDt] [smalldatetime] NOT NULL,
[Description] [varchar](500) NULL,
[Cost] [numeric](7, 2) NULL,
[FK_CustomerID] [int] NOT NULL,
[FK_EmpID] [int] NULL,
[STOVE](
[SerialNumber] [int] NOT NULL,
[Type] [char](15) NOT NULL,
[Version] [char](15) NULL,
[DateOfManufacture] [smalldatetime] NULL,
[Color] [varchar](12) NULL,
[FK_EmpId] [int] NULL,
所需的輸出:
type version times repaired
--------- ----- --------------
FiredAlways 2 2
我的輸出:
type version times repaired
--------- ----- --------------
FiredAlways 2 2
FiredAlways 1 1
FiredNow 2 1
FiredNow 3 1
FiredNow 1 1
FiredAlways 4 0
FiredAlways 5 0
FiredAlways 3 0
FiredAtCamp 3 0
FiredAtCamp 1 0
FiredAtCamp 2 0
結合使用TOP 1
或TOP (1) WITH TIES
。 當您有平局並且想要所有最高數字時,將使用后者。
但是,我質疑您對FULL JOIN
的使用。 這不是您想要的嗎?
SELECT TOP (1) S.Type AS Type, S.Version,
COUNT(R.FK_StoveNbr) AS TimesRepaired
FROM STOVE S INNER JOIN
STOVE_REPAIR R
ON S.SerialNumber = R.FK_StoveNbr
GROUP BY S.Type, S.Version
ORDER BY TimesRepaired DESC;
因為您得到的數量最多,所以我認為我們可以假定返還的爐灶至少有一份維修記錄。
如果要選擇計數最高的N條記錄,可以執行以下操作:
;WITH CountResults AS
(
SELECT
S.Type AS Type,
S.Version,
COUNT(R.FK_StoveNbr) AS TimesRepaired
FROM
STOVE AS S
FULL JOIN STOVE_REPAIR AS R ON S.SerialNumber = R.FK_StoveNbr
GROUP BY
S.Type,
S.Version
),
MaxCountResults AS
(
SELECT
MaxCountResult = MAX(C.TimesRepaired)
FROM
CountResults AS C
)
SELECT
C.Type,
C.Version,
C.TimesRepaired
FROM
CountResults AS C
INNER JOIN MaxCountResults AS M ON C.TimesRepaired = M.MaxCountResult
ORDER BY
C.TimesRepaired DESC
基本上,您首先確定最高數字,然后根據該數字過濾整個結果。
如果只需要最高的1,則簡單的TOP
就足夠了:
SELECT TOP 1
S.Type AS Type,
S.Version,
COUNT(R.FK_StoveNbr) AS TimesRepaired
FROM
STOVE AS S
FULL JOIN STOVE_REPAIR AS R ON S.SerialNumber = R.FK_StoveNbr
GROUP BY
S.Type,
S.Version
ORDER BY
TimesRepaired DESC
MAX
和COUNT
是兩個不同的函數,它們返回兩個不同的值。 你說
我基本上需要獲取列的最大計數。 這為我提供了我需要的信息,但是現在我需要進行設置,因此它僅顯示COUNT(R.FK_StoveNbr)中具有最高編號的Type。
當您運行引用的代碼時...
SELECT
S.Type AS Type,
S.Version,
COUNT(R.FK_StoveNbr) AS TimesRepaired
FROM STOVE AS S
FULL JOIN STOVE_REPAIR AS R
ON S.SerialNumber = R.FK_StoveNbr
GROUP BY S.Type, S.Version
ORDER BY TimesRepaired DESC;
您將獲得一個具有“ TYPE”,“ VERSION”和“ COUNT”的表-代表該類型和版本出現在數據集中的次數。 您說只需要1條記錄...
type version times repaired
--------- ----- --------------
FiredAlways 2 2
是否需要其他類型的“ MAX”? 如...
type version times repaired
--------- ----- --------------
FiredAlways 2 2
FiredAtCamp 3 0
FiredNow 2 1
總是有幾種處理方法,這取決於設置方式和您真正想要的東西。 這就是為什么我只想清楚地重申上面的內容並提出這些問題。 為了獲得類似於我發布的內容,我建議您做的是加入SUBQUERY。 子查詢在其中根據TYPE尋找COUNT的最大值。 然后,使用TYPE和COUNT將該子查詢聯接回原始結果集。
在我的頭頂上可能是...
SELECT
S.Type AS Type,
S.Version,
COUNT(R.FK_StoveNbr) AS TimesRepaired
FROM STOVE AS S
FULL JOIN STOVE_REPAIR AS R
ON S.SerialNumber = R.FK_StoveNbr
INNER JOIN ( SELECT
S2.Type AS Type,
MAX(COUNT(R2.FK_StoveNbr)) AS MXTimesRepaired
FROM STOVE AS S2
FULL JOIN STOVE_REPAIR AS R2
ON S2.SerialNumber = R2.FK_StoveNbr
) AS SI
ON S.Type = SI.Type
GROUP BY S.Type, S.Version
HAVING COUNT(R.FK_StoveNbr) = SI.MXTimesRepaired
ORDER BY TimesRepaired DESC;
我知道這會使您的結果集稍小一些,結果集具有明顯的集,但仍會基於類型包含多個記錄。 但是,在不了解其他某些字段的情況下,問題必須是“您要查找MAX的記錄是什么或僅需要記錄?” 是否有一個我們可以查看的ID字段,或者使我們想要查找該記錄的其他內容?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.