SQL技术问询:查找至少被排名5次的最低排名项
修正你的SQL,实现“找出至少被排名5次的最低排名项”需求
咱一步步来捋哈,你现在的SQL代码有几个语法和逻辑上的问题,导致它跑不起来,而且也没贴合你的需求,我来帮你修正并解释清楚:
原代码的问题点
- 语法顺序错误:SQL的执行逻辑里,
WHERE子句要放在GROUP BY之前,而且过滤聚合结果(比如COUNT(Ranking)>5这种条件)不能用WHERE,必须用HAVING子句(HAVING是专门用来过滤分组后的聚合结果的)。 - 聚合函数不符合需求:你用了
sum(Ranking),但需求是找“最低排名”,应该用MIN(Ranking)函数才对。 - 分组维度不全:只按
Key分组会把同一个Key下不同Name的记录合并,这显然不符合逻辑,应该同时按Key和Name分组,确保每个组对应一个唯一的项。
正确的SQL代码(基础版:获取符合条件的项及其最低排名)
如果你的需求是得到每个满足“至少排名5次”的项(Key+Name),以及它的最低排名,用这段代码就可以:
SELECT Key, Name, MIN(Ranking) AS lowest_ranking, -- 获取该组的最低排名 COUNT(Ranking) AS total_ranking_times -- 可选,显示该组的总排名次数 FROM df1 GROUP BY Key, Name -- 按项的唯一标识分组 HAVING COUNT(Ranking) >= 5 -- 过滤出排名次数≥5的组
进阶版:获取符合条件的项中,排名最低的具体记录
如果你需要的是具体的排名记录(而不只是最低排名值),比如每个符合条件的项里,排名最低的那条(或多条)记录,可以用窗口函数实现:
SELECT Key, Name, Ranking FROM ( SELECT Key, Name, Ranking, -- 统计每个项的总排名次数 COUNT(*) OVER (PARTITION BY Key, Name) AS ranking_count, -- 按排名升序给每个项内的记录编号,排名最低的编号为1 ROW_NUMBER() OVER (PARTITION BY Key, Name ORDER BY Ranking ASC) AS rank_num FROM df1 ) temp_table -- 筛选出排名次数≥5,且是该组内排名最低的记录 WHERE ranking_count >= 5 AND rank_num = 1
注意:如果同一个项里有多个相同的最低排名记录,
ROW_NUMBER()只会返回其中一条;如果想返回所有最低排名的记录,把ROW_NUMBER()换成RANK()即可。
内容的提问来源于stack exchange,提问作者Skyhopper9
相关产品推荐
相关产品推荐

