Sqlite - 获取编号行



我正在从数据库中检索人员列表,每个人都有一些点。我想要实现的是获取所有人员信息以及人员的积分和排名。点数是随时随地计算的,因为它们不存储在实体中,查询如下所示:

SELECT p.<some person attributes>, s.points, [here I need rank] as rank
FROM Persons p LEFT JOIN <subquery calculating points> s
ON p.id = s.personId
ORDER BY s.points DESC

在我的选择部分中,我需要在一个人的排名中获得一个位置(基本上是返回行的顺序,因为我按点排序,对吧?

是否有任何sql/sqlite列或函数来返回它?

这正是窗口函数的用途。具体来说,dense_rank还将处理多个用户具有相同点数的讨厌的边缘情况:

SELECT    p.<some person attributes> s.points,
DENSE_RANK() OVER (ORDER BY points DESC) as "rank"
FROM      Persons p 
LEFT JOIN <subquery calculating points> s ON p.id = s.personId
ORDER BY  s.points DESC

不幸的是,SQLite在这方面不是很擅长。 您几乎需要求助于相关的子查询:

with s as (
<subquery calculating points>
)
select p.<some person attributes>, s.points,
(select 1 + count(*)
from s s2
where s2.points > s.points
) as rank
from Persons p left join
s
on p.id = s.personId
order by s.points desc;

这专门实现了rank() over (order by points desc). 类似的逻辑可用于dense_rank()row_number(),如果这是您真正需要的。

最新更新