【问题标题】:Sqlite - get numbered rowsSqlite - 获取编号的行
【发布时间】:2018-09-25 16:41:25
【问题描述】:

我正在从数据库中检索人员列表,每个人都有一些要点。我想要实现的是获取所有人员信息以及人员的积分和排名。点是在旅途中计算的,因为它们不存储在实体中,查询看起来像这样:

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 列或函数可以返回它?

【问题讨论】:

    标签: sql sqlite select rank


    【解决方案1】:

    这正是窗口函数的用途。具体来说,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
    

    【讨论】:

    【解决方案2】:

    不幸的是,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(),如果这是你真正需要的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-19
      相关资源
      最近更新 更多