Sqlite - получить пронумерованные строки - PullRequest
0 голосов
/ 25 сентября 2018

Я получаю список людей из базы данных, и у каждого человека есть свои очки.Чего я хочу добиться, так это получить всю информацию о человеке, а также очки и звания.Очки рассчитываются на ходу, потому что они не сохраняются внутри объекта, и запрос выглядит примерно так:

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 голосов
/ 25 сентября 2018

К сожалению, 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(), если это то, что вам действительно нужно.

0 голосов
/ 25 сентября 2018

Это именно то, для чего предназначены оконные функции.В частности, 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
...