SQL Query для генерации таблицы лидеров и выбора информации об одном игроке - PullRequest
0 голосов
/ 07 октября 2018

Предположим, у нас есть следующий MYSQL-запрос для создания таблицы лидеров:

SELECT x.player_id, x.position,x.leaderboard_value

FROM (SELECT player_id,@rownum := @rownum + 1 AS position,leaderboard_value
      FROM table1
      JOIN (SELECT @rownum := 0) r
      WHERE restrictive_value<200
      ORDER BY leaderboard_value DESC) x

, которая создает таблицу лидеров следующим образом:

leaderboard

Текстовый файл в формате CSV: https://www.dropbox.com/s/70xw3ocbonqs98s/sql.csv?dl=0

Как изменить или расширить запрос для предоставления определенной позиции игрока и общего количества позиций (самая высокая позиция)

для таблицы выше и player_id = 10649 я ожидаю таблицу результатов с 1 строкой, содержащей следующие поля:

позиция: 6, общее количество позиций: 20, процент = 0,3 (что составляет 6/20)

Предыстория этого состоит в том, чтобы объединить этот процент с другой таблицей rank_map (rank_id, minvalue, maxvalue), определяющей ранги (rank имеет значение «9», когда это значение находится в диапазоне от 0,2 до 0,4, например)

В концеэтот запрос должен просто вернуть rank: 9 в качестве ответа

Большое спасибо.

ОБНОВЛЕНИЕ:

с Гордоном Линоффомответ, используя этот запрос:

SELECT MAX(CASE WHEN player_id = 10649 THEN position END) as play_position,
   COUNT(*) as total_position,
   MAX(CASE WHEN player_id = 10649 THEN position END) / COUNT(*) as ratio
FROM (SELECT t1.*, @rownum := @rownum + 1 AS position
  FROM table1 t1 CROSS JOIN
       (SELECT @rownum := 0) r
  WHERE restrictive_value < 200
  ORDER BY leaderboard_value DESC
 ) x;

Я могу получить эту таблицу: second step

Остался последний шаг, а именно, как объединить его с таблицей rank (rank_id, minvalue, maxvalue), чтобы получить только строку rank_id, в которой соотношение находится между minvalue и maxvalue?

Ответы [ 2 ]

0 голосов
/ 07 октября 2018

Этого можно добиться, добавив COUNT(*) к вашему подзапросу JOIN, чтобы получить общее количество строк, а затем отобразить процент в виде позиции / итога:

SELECT x.player_id, x.position,x.leaderboard_value, (x.position/x.total) AS percentage
FROM (SELECT total, player_id,@rownum := @rownum + 1 AS position,leaderboard_value
      FROM table1
      JOIN (SELECT @rownum := 0) r
      JOIN (SELECT COUNT(*) AS total FROM table1) c
      WHERE restrictive_value<200
      ORDER BY leaderboard_value DESC) x

Некоторые выходные данные из вашегопример данных:

player_id   position    leaderboard_value   percentage
2730        1           1090                0.01
1369848     2           1017                0.02
1665922     3           960                 0.03
1607632     4           910                 0.04
1853500     5           909                 0.05
10649       6           883                 0.06
1538490     7           877                 0.07
1898051     8           866                 0.08
1510162     9           828                 0.09
1898129     10          825                 0.1
1863538     11          821                 0.11
1522562     12          806                 0.12
1380267     13          805                 0.13
1404318     14          797                 0.14
8793        15          769                 0.15
21793       16          767                 0.16
14658       17          756                 0.17
1690659     18          729                 0.18
1429094     19          723                 0.19
1727977     20          719                 0.2

Демонстрация SQLFiddle

Чтобы получить данные только для конкретного игрока, просто добавьте предложение WHERE x.player_id=nnnn, например

SELECT x.player_id, x.position,x.leaderboard_value, (x.position/x.total) AS percentage
FROM (SELECT total, player_id,@rownum := @rownum + 1 AS position,leaderboard_value
      FROM table1
      JOIN (SELECT @rownum := 0) r
      JOIN (SELECT COUNT(*) AS total FROM table1) c
      WHERE restrictive_value<200
      ORDER BY leaderboard_value DESC) x
WHERE x.player_id = 10649

Вывод:

player_id   position    leaderboard_value   percentage
10649       6           883                 0.06

Чтобы затем получить их рейтинг из таблицы рангов, вам просто нужно JOIN это на основе процента (обратите внимание, что вы должны использовать формулу, поскольку вы не можете использоватьпсевдоним в JOIN):

SELECT x.player_id, x.position,x.leaderboard_value, (x.position/x.total) AS percentage, m.rank_id
FROM (SELECT total, player_id,@rownum := @rownum + 1 AS position,leaderboard_value
      FROM table1
      JOIN (SELECT @rownum := 0) r
      JOIN (SELECT COUNT(*) AS total FROM table1) c
      WHERE restrictive_value<200
      ORDER BY leaderboard_value DESC) x
JOIN rank_map m ON m.minvalue <= (x.position/x.total) AND m.maxvalue > (x.position/x.total)
WHERE x.player_id = 10649

Вывод:

player_id   position    leaderboard_value   percentage  rank_id
10649       6           883                 0.06        3

Обновленная демоверсия

0 голосов
/ 07 октября 2018

Для этой цели вы можете использовать условное агрегирование:

SELECT MAX(CASE WHEN player_id = 10649 THEN position END) as play_position,
       COUNT(*) as total_position,
       MAX(CASE WHEN player_id = 10649 THEN position END) / COUNT(*) as ratio
FROM (SELECT t1.*, @rownum := @rownum + 1 AS position
      FROM table1 t1 CROSS JOIN
           (SELECT @rownum := 0) r
      WHERE restrictive_value < 200
      ORDER BY leaderboard_value DESC
     ) x;

Вы можете использовать COUNT(*) или MAX(position) для самой высокой позиции.

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