Извлечение одной строки максимальных данных из нескольких запросов - PullRequest
1 голос
/ 19 марта 2020

Я управляю сайтом статистики баскетбола, и у меня есть таблица с названием game_stats_lakers.

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

Я хочу сгруппировать его по всем временам года (sid) игрока (playerid) в команде.

Каждая игра имеет только один гид, но, очевидно, каждый максимальный показатель может быть из другой игры. Проще говоря, я хочу, чтобы каждый игрок за сезон получал наибольшее количество очков, помощь и отскок для каждого игрока.

Я хочу, чтобы результат запроса был похож на приведенный ниже.

playerid  sid    max_points  max_points_gid  max_assists  max_assists_gid  max_totr max_totr_gid
2         0304r  60          234             15           203              20       544
2         0405r  62          271             16           135              15       356        

Имеет ли это смысл?

Я просто не знаю, как это сделать, я пробовал так много разных запросов, и все они просто никогда не были правы. Это мои настоящие имена полей (очки, ассисты, тотр, гид, playerid, sid), я просто привел случайные числа в качестве примера.

Большое спасибо за любую помощь!

Формат моей таблицы game_stats_lakers выглядит следующим образом.

gid teamid sid   playerid min fgm fga 3ptm 3pta ftm fta points assists totr 
233 2      0304r 300      35  3   10  2    5    10  12  18     13      6
234 2      0304r 300      26  2   5   0    1    2   3   6      2       3
235 2      0304r 300      29  10  20  3    8    10  12  33     4       2

Использование второго решения GMB, приведенного ниже, близко. Я вставил свой код и результат. Проблема в том, что гид не меняется для каждого сезона, тот же самый гид снижается с первого сезона. Вот результат. Идеи?

Выполнение запроса:

select
playerid,
sid,
max(points) max_points,
(
    select t1.gid 
    from game_stats_lakers t1 
    where t1.playerid = t.playerid 
    order by t1.points desc limit 1
) max_points_gid,
max(assists) max_assists,
(
    select t1.gid 
    from game_stats_lakers t1 
    where t1.playerid = t.playerid 
    order by t1.assists desc limit 1
) max_assists_gid,
max(totr) max_totr,
(
    select t1.gid 
    from game_stats_lakers t1 
    where t1.playerid = t.playerid 
    order by t1.totr desc limit 1
) max_totr_gid from game_stats_lakers t group by playerid, sid

Результат здесь ... обратите внимание на повторные GID.

playerid sid    max_points  max_points_gid   max_assists  max_assists_gid max_totr  max_totr_gid
2        0304r  45          233              13           669             10        404 
2        0405r  42          233              14           669             8         404
2        0506r  81          233              11           669             12        404
2        0607r  60          233              16           669             11        404

Ответы [ 2 ]

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

Ребята, у меня все получилось, чтобы наконец-то сработать, мне нужно было добавить сравнение sid, и это выявляло разные gid для каждого года. Спасибо GMB за то, что вы выбрали меня на правильном пути. Вот последний запрос, который работал.

select
playerid,
sid,
max(points) max_points,
(
    select t1.gid 
    from game_stats_lakers t1 
    where t1.playerid = t.playerid and t1.sid = t.sid
    order by t1.points desc limit 1
) max_points_gid,
max(assists) max_assists,
(
    select t1.gid 
    from game_stats_lakers t1 
    where t1.playerid = t.playerid and t1.sid = t.sid
    order by t1.assists desc limit 1
) max_assists_gid,
max(totr) max_totr,
(
    select t1.gid 
    from game_stats_lakers t1 
    where t1.playerid = t.playerid and t1.sid = t.sid 
    order by t1.totr desc limit 1
) max_totr_gid from game_stats_lakers t group by playerid, sid
0 голосов
/ 19 марта 2020

Если вы используете MySQL 8.0, вы можете сделать это с помощью оконных функций:

select distinct
    player_id,
    sid,
    max(points) over(partition by player_id, sid) max_points
    first_value(game_id) over(partition by player_id, sid order by score desc) max_points_gid,
    max(assists) over(partition by player_id, sid) max_assists
    first_value(game_id) over(partition by player_id, sid order by assists desc) max_assists_gid,
    max(totr) over(partition by player_id, sid) max_totr
    first_value(game_id) over(partition by player_id, sid order by totr desc) max_totr_gid
from game_stats_lakers

В более ранних версиях разумным подходом может быть пара взаимосвязанных подзапросов:

select
    player_id,
    sid,
    max(points) max_score,
    (
        select t1.game_id 
        from game_stats_lakers t1 
        where t1.player_id = t.player_id and t1.sid = t.sid
        order by t1.points desc limit 1
    ) max_points_gid,
    max(assists) max_assists,
    (
        select t1.game_id 
        from game_stats_lakers t1 
        where t1.player_id = t.player_id and t1.sid = t.sid 
        order by t1.assists desc limit 1
    ) max_assists_gid,
    max(totr) max_totr,
    (
        select t1.game_id 
        from game_stats_lakers t1 
        where t1.player_id = t.player_id and t1.sid = t.sid
        order by t1.totr desc limit 1
    ) max_totr_gid
from game_stats_lakers t
group by player_id, sid
...