В любом случае, чтобы получить позицию указанной строки c в упорядоченном запросе в Sqlite3? - PullRequest
0 голосов
/ 13 марта 2020

Допустим, для моего приложения на основе sqlite3 есть таблица лидеров. У всех пользователей есть уровень, и есть тысячи пользователей. Если бы я хотел получить список лидеров, я бы запросил пользователей с лимитом 10 и упорядочил их по убыванию. Теперь это работает. Но что, если бы я хотел, чтобы в списке лидеров был 11-й пользователь, а не человек с 11-м по величине уровнем. Это пользователь, который выполнил проверку списка лидеров. Я хочу, чтобы они помогли им получить список лидеров и увидеть 10 лучших пользователей уровня, но увидеть себя на 11-м месте, в каком месте они находятся. Это то, что я не знаю, как сделать. Как я могу получить место, положение этого пользователя по сравнению со всеми остальными, не запрашивая всю базу данных. В моем приложении около 100 тыс. Строк пользователей, если выбор базы данных слишком неэффективен.

Вот пример того, как я хочу, чтобы он выглядел (увеличил таблицу лидеров до 5 вместо 10 для простоты)

1. BobBobman123 (lvl 104)
2. Jin73 (lvl 99)
3. iefa44 (lvl 78)
4. jobSteve_8 (lvl 68)
5. david4 (lvl 61)
143. harrypotter64 (lvl 7)

То, что я хочу сделать sh, было бы, например, иметь возможность получить место harrypotter64 (человек, который проверил таблицу лидеров). Место в этом примере будет 143.

1 Ответ

0 голосов
/ 13 марта 2020

Оконные функции на помощь! (Требуется sqlite 3.25 или новее). Что-то вроде

WITH ranked AS
 (SELECT dense_rank() OVER (ORDER BY level DESC) AS position
       , username, level
  FROM leaderboard)
SELECT *
FROM ranked
WHERE position <= 10 OR username = 'harrypotter64'
ORDER BY position

с индексом leaderboard(level DESC) для эффективности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...