我正在从数据库中检索人员列表,每个人都有一些要点。我想要实现的是获取所有人的信息以及其得分和排名。点是在旅途中计算的,因为它们没有存储在实体中并且查询看起来像这样:
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列或函数返回该值?
答案 0 :(得分:2)
这正是窗口功能的作用。具体来说,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
答案 1 :(得分:1)
不幸的是,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()
,则可以使用类似的逻辑。