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

如何在SQLite中获取排序后指定行的行号?求助解决查询报错

解决你的员工工资排名查询问题

嘿,我来帮你搞定这个问题!你的查询逻辑出了点小问题,导致结果不符合预期,甚至可能报错,我来一步步给你拆解:

问题根源

你写的查询里,WHERE Name='Ram'是在窗口函数ROW_NUMBER()计算之前执行的——数据库会先把只有Ram的那一行筛选出来,再给这唯一的一行分配行号,结果自然是1,完全不是你想要的“整个表按工资降序后排第二”的效果。另外,你还漏掉了DESC关键字,默认排序是升序,就算逻辑对了,结果也会反过来。

正确的查询写法

你需要先给所有员工按工资降序分配好行号,再筛选出Ram的记录,这里有两种常用的写法:

方法1:子查询

SELECT RowNum
FROM (
    -- 先给所有员工按工资降序生成行号
    SELECT Name, ROW_NUMBER() OVER (ORDER BY Salary DESC) AS RowNum
    FROM Employee
) AS RankedEmployees
-- 再筛选出Ram的行号
WHERE Name = 'Ram';

方法2:CTE(公共表表达式,可读性更好)

WITH RankedEmployees AS (
    SELECT Name, ROW_NUMBER() OVER (ORDER BY Salary DESC) AS RowNum
    FROM Employee
)
SELECT RowNum
FROM RankedEmployees
WHERE Name = 'Ram';

额外小提示

如果你的表里有多个员工工资相同,ROW_NUMBER()会给他们分配不同的行号。如果你想让同工资的人拥有相同的排名,可以换成RANK()或者DENSE_RANK():

  • RANK():同工资的人排名相同,后续排名会跳过对应的位数(比如两个第1,下一个是第3)
  • DENSE_RANK():同工资的人排名相同,后续排名不会跳过(比如两个第1,下一个是第2)

举个用RANK()的例子:

WITH RankedEmployees AS (
    SELECT Name, RANK() OVER (ORDER BY Salary DESC) AS RankNum
    FROM Employee
)
SELECT RankNum
FROM RankedEmployees
WHERE Name = 'Ram';

内容的提问来源于stack exchange,提问作者Pahalavan R D

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:51:43