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

如何优化SQL查询以基于指定声望获取Stack Overflow最近权限

解决同声望多权限场景下的权限查询问题

我之前处理过类似的业务需求,你的核心问题在于原来的查询是通过MAX(Id)和MIN(Id)来筛选,这会漏掉同一声望值对应的多个权限——毕竟权限组是按声望值划分的,不是按ID。

正确的思路应该是:

  1. 找到小于等于目标声望的最大声望值,这个值对应的所有权限就是你要的「最近已获得的权限组」;
  2. 找到大于目标声望的最小声望值,这个值对应的所有权限就是「下一个可达成的权限组」;
  3. 把这两个声望值对应的所有权限拉出来,按声望和ID排序即可。

下面是修正后的查询代码:

DECLARE @MyReputation AS INT = 10; -- 替换为你的目标声望值,比如945、7276等

-- 获取已获得权限的最高声望阈值
DECLARE @MaxAvailableRep AS INT = (
    SELECT MAX(Reputation) 
    FROM Privilege 
    WHERE Reputation > 0 AND Reputation <= @MyReputation
);

-- 获取下一个权限的最低声望阈值
DECLARE @NextRequiredRep AS INT = (
    SELECT MIN(Reputation) 
    FROM Privilege 
    WHERE Reputation > @MyReputation
);

-- 查询对应声望的所有权限,按声望、ID排序
SELECT Id, Reputation, PrivilegeName
FROM Privilege
WHERE Reputation IN (@MaxAvailableRep, @NextRequiredRep)
ORDER BY Reputation, Id;

测试验证

  • 当输入声望为10或13时,@MaxAvailableRep是10,@NextRequiredRep是15,会输出所有声望10和15的权限,完全符合你的期望;
  • 输入声望945时,@MaxAvailableRep是500,@NextRequiredRep是1000,会输出声望500的权限,以及声望1000的所有权限;
  • 输入声望7276时,@MaxAvailableRep是5000,@NextRequiredRep是10000,输出结果和你原来的正确案例一致。

补充边缘场景处理

如果需要处理「目标声望高于所有权限」或「目标声望低于所有权限」的情况,可以用ISNULL来兼容,比如:

SELECT Id, Reputation, PrivilegeName
FROM Privilege
WHERE 
    (Reputation = @MaxAvailableRep OR @MaxAvailableRep IS NULL)
    AND (Reputation = @NextRequiredRep OR @NextRequiredRep IS NULL)
ORDER BY Reputation, Id;

这样当目标声望超过所有权限时,只会输出最高声望的所有权限;当目标声望低于所有权限时,只会输出最低声望的所有权限。

内容的提问来源于stack exchange,提问作者Arulkumar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:31:56