【问题标题】:Get the Defect Type with the maximum Total Defect Qty获取具有最大总缺陷数量的缺陷类型
【发布时间】:2021-03-19 05:56:22
【问题描述】:

我有以下查询,它获取每个缺陷类型的缺陷数量总和:

SELECT 
[Defect Type]
,YEAR([Date]) AS YearOfDefect
,SUM([Total Defect Qty]) AS [Sum] FROM SupplierQuality
GROUP BY [Defect Type],YEAR([Date])

这是结果:

我想要总缺陷数量之和最大的缺陷类型,如下所示:

DefectType  YearOfDefect Sum    
No Impact   2019         586780230
No Impact   2018         437989564

【问题讨论】:

  • 假设您在一年之后达到了最大SUM?如果不是,那是什么定义了您所拥有的 2 行,因为它们具有相同的缺陷类型。
  • 说 2018 年 Rejected 比别人多,你要返回那一年的 Rejected 吗?

标签: sql sql-server tsql aggregate-functions greatest-n-per-group


【解决方案1】:

另请参考另一种方法:

with cte
as(SELECT 
[Defect Type]
,YEAR([Date]) AS YearOfDefect
,SUM([Total Defect Qty]) AS [Sum] FROM SupplierQuality
GROUP BY [Defect Type],YEAR([Date]))
,cte2 as
(select YearOfDefect,max([Sum]) [Sum] 
from cte 
group by YearOfDefect)

select c1.[Defect Type],c2.YearOfDefect,c2.[Sum] 
from cte c1
join c2
on c1.[Defect Type]=c2.[Defect Type] and c1.YearOfDefect=c2.YearOfDefect

【讨论】:

    【解决方案2】:

    假设我在 cmets 中所做的假设是每年,那么您可以使用 ROW_NUMBER 来获取每组的“顶部”行:

    WITH CTE AS(
        SELECT [Defect Type],
               YEAR([Date]) AS YearOfDefect,
               SUM([Total Defect Qty]) AS [Sum]
        FROM SupplierQuality
        GROUP BY [Defect Type],
                 YEAR([Date]))
    SELECT TOP (1) WITH TIES
           [Defect Type],
           YearOfDefect,
           [Sum]
    FROM CTE
    ORDER BY ROW_NUMBER() OVER (PARTITION BY YearOfDefect ORDER BY [Sum] DESC);
    

    【讨论】:

      【解决方案3】:

      一个简单的选项使用with ties:

      SELECT TOP (1) WITH TIES
          [Defect Type],
          YEAR([Date]) AS YearOfDefect,
          SUM([Total Defect Qty]) AS [Sum] 
      FROM SupplierQuality
      GROUP BY [Defect Type], YEAR([Date])
      ORDER BY RANK() OVER(PARTITION BY YEAR([Date]) ORDER BY SUM([Total Defect Qty]) DESC)
      

      缺点是这不能让您控制结果集的顺序。如果您确实需要该功能,请使用子查询:

      SELECT *
      FROM (
          SELECT
              [Defect Type],
              YEAR([Date]) AS YearOfDefect,
              SUM([Total Defect Qty]) AS [Sum],
               RANK() OVER(PARTITION BY YEAR([Date]) ORDER BY SUM([Total Defect Qty]) DESC) rn
          FROM SupplierQuality
          GROUP BY [Defect Type], YEAR([Date])
      ) t
      WHERE rn = 1
      ORDER BY YearOfDefect
      

      【讨论】:

        猜你喜欢
        • 2014-08-08
        • 2017-07-31
        • 2012-06-05
        • 1970-01-01
        • 2013-07-29
        • 2018-08-24
        • 2017-11-12
        • 2017-03-31
        • 2012-12-30
        相关资源
        最近更新 更多