Mysql Текущая победная серия

0

Я пытаюсь получить текущую выигрышную серию на основе таблицы результатов. У меня много проблем с этим. Мне удалось получить то, что команда выиграла подряд за каждую команду за весь период. Но то, что я не могу сделать, это получить текущую выигрышную серию, если у них есть один, основанный на последнем результате для каждой команды.

Например, приведенная ниже таблица, в которой результат "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. Спасибо за любую помощь по этому поводу.

Теги:

1 ответ

1
Лучший ответ

Как задать вопрос;

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 |
+--------+--------+------------+------+------+
  • 0
    Спасибо за это, я был немного озадачен тем, как работает публикация, и потребовалось около 25 минут, чтобы получить эту таблицу. Я расскажу об этом подробнее в следующий раз, когда я отправлю сообщение. Спасибо за решение, я думаю, я был слишком сложным.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню