簡體   English   中英

獲取最大計數SQL

[英]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 1TOP (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

MAXCOUNT是兩個不同的函數,它們返回兩個不同的值。 你說

我基本上需要獲取列的最大計數。 這為我提供了我需要的信息,但是現在我需要進行設置,因此它僅顯示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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM