如何在单条SQL查询中生成双排名并优先展示首排名为1的结果
解决方案
要同时实现生成两种排名并将指定记录置顶的需求,你可以通过子查询生成排名+外层排序置顶的方式完成,修正后的SQL代码如下:
SELECT id, name, password, oldname, number, rank_mx, rank_number FROM ( SELECT id, name, password, oldname, number, -- 基于oldname="mxmx"匹配结果降序的排名,匹配成功的记录排名为1 RANK() OVER(ORDER BY (oldname = 'mxmx') DESC) AS rank_mx, -- 基于number字段降序的排名 RANK() OVER(ORDER BY number DESC) AS rank_number FROM account ) AS ranked_result ORDER BY -- 将rank_mx=1的记录强制排在首位 CASE WHEN rank_mx = 1 THEN 0 ELSE 1 END, -- 其余记录按rank_mx顺序排列,也可根据业务需求替换为rank_number rank_mx, rank_number;
关键说明
- 修正语法问题:原SQL中第二个
RANK()函数未分配别名,导致语法错误,这里给两个窗口函数分别命名为rank_mx和rank_number,清晰区分两种排名逻辑。 - 置顶指定记录:外层查询通过
CASE表达式设置排序优先级,让rank_mx=1的记录优先级为0,其余为1,确保这类记录始终出现在结果最前面。 - 排名逻辑解析:
rank_mx:oldname="mxmx"的记录会被标记为true(数值等价于1),降序排序后这类记录排名为1;其他记录标记为false(数值等价于0),排名靠后。rank_number:严格按照number字段数值从大到小生成排名,相同number值的记录会获得相同排名。
内容的提问来源于stack exchange,提问作者Matin
相关产品推荐
相关产品推荐

