Sqlite-获取编号行

Sqlite-获取编号行,sql,sqlite,select,rank,Sql,Sqlite,Select,Rank,我正在从数据库中检索人员列表,每个人都有自己的观点。我想要实现的是获得所有的个人信息以及个人的分数和等级。点是在移动中计算的,因为它们不存储在实体中,查询如下所示: 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

我正在从数据库中检索人员列表,每个人都有自己的观点。我想要实现的是获得所有的个人信息以及个人的分数和等级。点是在移动中计算的,因为它们不存储在实体中,查询如下所示:

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;

这特别实现了按点描述排序。如果您真正需要的话,类似的逻辑可以用于密集排列或行编号。

这看起来很酷,但我最终总是在密集排列之后得到无关的输入。我在这里读到,它在Sqlite@MichałPowłoka中是不受支持的,在Sqlite中也是如此。