SQLite-获取编号行

时间:2018-09-25 16:41:26

标签: 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 BY s.points DESC

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

是否有任何sql / sqlite列或函数返回该值?

2 个答案:

答案 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(),则可以使用类似的逻辑。