如何不使用GROUP BY查找出现次数最多的产品类别
需求说明
不使用GROUP BY语法,查询得到产品表中重复出现次数最多的类别。
当前尝试编写的SQL如下:
SELECT MAX(COUNT(c.CategoryID) OVER (PARTITION BY c.CategoryName)) FROM [Categories] c left join Products p on c.CategoryID=p.CategoryID
当前语句存在的问题
- 该语句最终只会返回最大的类别出现次数数值,无法返回对应的类别ID、类别名称等核心信息
- 直接在窗口函数外嵌套
MAX()聚合时,没有对关联结果去重,两表关联产生的重复行会导致计数结果偏大 - 直接统计
c.CategoryID会把没有对应产品的类别也计入统计(计数为1),和实际产品关联的类别计数逻辑不一致
无GROUP BY的正确实现方案
WITH CategoryStat AS ( SELECT DISTINCT c.CategoryID, c.CategoryName, COUNT(p.ProductID) OVER (PARTITION BY c.CategoryID) AS ProductTotal FROM Categories c LEFT JOIN Products p ON c.CategoryID = p.CategoryID ), CategoryRank AS ( SELECT CategoryID, CategoryName, ProductTotal, RANK() OVER (ORDER BY ProductTotal DESC) AS SortRank FROM CategoryStat ) SELECT CategoryID, CategoryName, ProductTotal AS MaxRepeatCount FROM CategoryRank WHERE SortRank = 1;
实现逻辑说明
- 第一层公共表达式通过
COUNT() OVER(PARTITION BY c.CategoryID)窗口函数完成按类别维度的计数,全程不使用GROUP BY;DISTINCT用于消除两表关联产生的重复行,统计p.ProductID可以自动将无关联产品的类别计数置为0,避免统计偏差 - 第二层公共表达式通过
RANK()窗口函数按类别产品总数倒序打排名,天然支持多个类别并列出现次数最多的场景 - 最终筛选排名为1的记录,即为出现次数最多的类别,同时返回类别基础信息和对应的重复次数
内容的提问来源于stack exchange,提问作者Aljoharah A
相关产品推荐
相关产品推荐

