Рассчитать накопленный процент проигрыша - PullRequest
0 голосов
/ 26 марта 2019

В настоящее время у меня есть список всех игр, сыгранных командой, в которых список выводит название команды, счет, имя оппонента и счет, а также W (Won), L (Lost) или D (Draw), которые являются производными из моей таблицы "MatchDetails2017". То, что я хочу сделать, это отображать совокупный процент побед после каждой игры.

Я потратил несколько часов, пытаясь найти помощь в Интернете, и ударил кирпичную стену.

SELECT Game, WL, ((SELECT COUNT(WL) FROM MatchDetails2017 WHERE Team = 'TeamName' AND WL = 'W')/COUNT(*))*100   
FROM MatchDetails2017
WHERE Team = 'TeamName'
GROUP BY Game

Например, я хочу, чтобы данные отображались следующим образом ...

Game|Result|Win%
    1|W|100.00
    2|W|100.00
    3|W|100.00
    4|L|75.00
    5|D|60.00
    6|W|66.67

Это мои результаты, которые я сейчас получаю ...

1 W 5200.0000
2 W 5200.0000
3 W 5200.0000
4 L 5200.0000
5 D 5200.0000
6 W 5200.0000

Ответы [ 2 ]

1 голос
/ 26 марта 2019

Для того, чтобы это работало, COUNT(*) для вычисления общего количества игр также должно относиться только к предыдущим играм, поэтому вы должны включить его в свой подзапрос. Вам также нужно ограничить подзапрос только играми, включая текущую и предшествующую ей:

SELECT Game, 
       WL AS Result,
       (SELECT SUM(WL = 'W') / COUNT(*) FROM MatchDetails2017 m2 WHERE m2.Game <= m1.Game AND m2.Team = m1.Team) * 100 AS `Win%`
FROM MatchDetails2017 m1
WHERE Team = 'TeamName'

Выход:

Game    Result  Win%
1       W       100
2       W       100
3       W       100
4       L       75
5       D       60
6       W       66.6667

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

Обратите внимание, что этот запрос использует тот факт, что MySQL обрабатывает логические значения как 1 или 0 в числовом контексте, поэтому мы можем SUM(WL = 'W') получить общее количество побед.

0 голосов
/ 26 марта 2019

В MySQL 8+ мы можем попробовать использовать COUNT в качестве аналитической функции:

SELECT
    TeamID,
    Game,
    WL,
    COUNT(CASE WHEN WL = 'W' THEN 1 END) OVER (PARTITION BY TeamId ORDER BY Game) /
        COUNT(*) OVER (PARTITION BY TeamId) win_pct
FROM MatchDetails2017
ORDER BY
    TeamID,
    Game;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...