You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:11:44