如何在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
相关产品推荐
相关产品推荐

