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中也是如此。