SQL Server 2014:获取分组统计后的最小计数结果
解决方案
针对UserGame表中GameType=2的数据,我们需要按GameId分组,找出每个GameId下计数最少的Number值;若多个Number计数相同,则返回对应IID最小的那个。
你的原查询存在两个核心问题:
- 第一个CTE的
GROUP BY包含了IID,导致每个IID单独成组,无法正确统计每个Number的总计数 - 排名函数的排序逻辑错误,未遵循「计数升序+最小IID升序」的筛选规则
以下是修正后的查询语句:
WITH NumberCounts AS ( -- 统计每个GameId下每个Number的总出现次数,同时记录该Number对应的最小IID SELECT GameId, Number, COUNT(*) AS TotalNo, MIN(IID) AS MinIID FROM UserGame WHERE GameType = 2 GROUP BY GameId, Number ), RankedNumbers AS ( -- 对每个GameId内的Number,按计数升序、最小IID升序排名 SELECT GameId, Number, TotalNo, ROW_NUMBER() OVER ( PARTITION BY GameId ORDER BY TotalNo ASC, MinIID ASC ) AS RowRank FROM NumberCounts ) -- 筛选每个GameId中排名第一的记录 SELECT GameId, Number, TotalNo FROM RankedNumbers WHERE RowRank = 1;
逻辑说明:
- NumberCounts:按
GameId和Number分组,统计每个Number的总出现次数TotalNo,同时用MIN(IID)获取该Number对应的最小IID,为同分情况的筛选做准备。 - RankedNumbers:使用
ROW_NUMBER()函数,在每个GameId分组内,先按TotalNo从小到大排序(优先选计数最少的),再按MinIID从小到大排序(计数相同时选IID最小的),排名为1的就是目标记录。 - 最后通过
RowRank=1筛选出每个GameId符合要求的结果。
内容的提问来源于stack exchange,提问作者Partha
相关产品推荐
相关产品推荐

