Я пытаюсь получить текущую выигрышную серию на основе таблицы результатов. У меня много проблем с этим. Мне удалось получить то, что команда выиграла подряд за каждую команду за весь период. Но то, что я не могу сделать, это получить текущую выигрышную серию, если у них есть один, основанный на последнем результате для каждой команды.
Например, приведенная ниже таблица, в которой результат "H" обозначается как победа.
TeamID Result Date
25 A 02/12/17
25 H 16/12/17
25 D 22/12/17
25 D 03/01/18
25 H 20/01/18
28 D 09/12/17
28 D 23/12/17
28 H 01/01/18
28 H 20/01/18
58 H 02/12/17
58 A 16/12/17
58 H 23/12/17
58 H 01/01/18
58 D 20/01/18
61 D 03/12/17
61 A 17/12/17
61 D 26/12/17
61 H 30/12/17
61 H 14/01/18
Так что TeamID 25 имеет текущую строку выигрыша 1. TeamID 28 - выигрышная полоса 2 и команда 58 - победная сериал 0, так как последний результат был "D" (Draw). Я использовал приведенный ниже код, который я могу получить, но не с дополнительной группировкой результаты возвращаются все как 1, что явно неверно.
http://www.sqlteam.com/article/detecting-runs-or-streaks-in-your-data
Я посмотрел на другие биты кода здесь, но ни один из них, по-видимому, не основан на последнем результате, или они основаны на SQL Server, но мне нужен код для работы в MySQL. Спасибо за любую помощь по этому поводу.
Как задать вопрос;
DROP TABLE IF EXISTS my_table;
CREATE TABLE my_table
(TeamID INT NOT NULL
,Result CHAR(1) NOT NULL
,Date DATE NOT NULL
,PRIMARY KEY(teamid,date)
);
INSERT INTO my_table VALUES
(25,'A','2017-12-02'),
(25,'H','2017-12-16'),
(25,'D','2017-12-22'),
(25,'D','2018-01-03'),
(25,'H','2018-01-20'),
(28,'D','2017-12-09'),
(28,'D','2017-12-23'),
(28,'H','2018-01-01'),
(28,'H','2018-01-20'),
(58,'H','2017-12-02'),
(58,'A','2017-12-16'),
(58,'H','2017-12-23'),
(58,'H','2018-01-01'),
(58,'D','2018-01-20'),
(61,'D','2017-12-03'),
(61,'A','2017-12-17'),
(61,'D','2017-12-26'),
(61,'H','2017-12-30'),
(61,'H','2018-01-14');
Как ответить:
SELECT a.*
FROM
( SELECT x.*
, CASE WHEN @prev=teamid THEN CASE WHEN result = 'H' THEN @i:=@i+1 ELSE @i:=0 END ELSE @i:=0 END i
, @prev:=teamid prev
FROM my_table x
, (SELECT @prev:=null,@i:=0) vars
ORDER
BY teamid
, date
) a
JOIN
( SELECT teamid
, MAX(date) date
FROM my_table
GROUP
BY teamid
) b
ON b.teamid = a.teamid
AND b.date = a.date;
+--------+--------+------------+------+------+
| TeamID | Result | Date | i | prev |
+--------+--------+------------+------+------+
| 25 | H | 2018-01-20 | 1 | 25 |
| 28 | H | 2018-01-20 | 2 | 28 |
| 58 | D | 2018-01-20 | 0 | 58 |
| 61 | H | 2018-01-14 | 2 | 61 |
+--------+--------+------------+------+------+