【问题标题】:Mysql - Count date consecutive with condition and get range listMysql - 根据条件计算连续日期并获取范围列表
【发布时间】:2015-08-15 02:42:47
【问题描述】:

我需要知道一支球队连续赢了多少天 (value1 > value2),并知道第一场和最后一场比赛获胜的日期。并按获胜日期和日期显示 10 个范围的列表。 我知道这并不容易。这对我来说并不容易。我尝试进行一些查询和子查询,但没有好的结果。谢谢 我有一张桌子与

            CREATE TABLE `games` (
              `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
              `value1` int(11) NOT NULL,
              `value2` int(11) NOT NULL,
              `played` date NOT NULL,
              PRIMARY KEY (`id`),
              KEY `played` (`played`)
            ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1;

            insert into games (value1, value2, played)
            values
            ("2", "3", "1943-05-09"),
            ("4", "3", "1943-08-15"),
            ("1", "8", "1943-08-22"),
            ("0", "4", "1943-08-29"),
            ("1", "0", "1943-09-12"),
            ("1", "3", "1943-09-26"),
            ("6", "1", "1943-10-03"),
            ("3", "2", "1943-10-10"),
            ("3", "3", "1944-07-16"),
            ("1", "1", "1944-08-06"),
            ("4", "1", "1944-09-24"),
            ("0", "7", "1944-10-08"),
            ("0", "1", "1945-05-13"), // 1
            ("4", "2", "1945-11-04"), // 2
            ("3", "2", "1946-05-12"), // 3 second 3 consecutives win
            ("4", "2", "1946-11-17"),
            ("2", "2", "1946-11-24"),
            ("1", "5", "1946-12-01"),
            ("1", "0", "1947-05-18"),
            ("3", "0", "1947-10-05"),
            ("2", "3", "1948-11-07"),
            ("0", "1", "1948-11-14"),
            ("1", "4", "1948-11-21"),
            ("3", "1", "1949-06-12"), // 1
            ("4", "0", "1949-06-19"), // 2
            ("5", "1", "1949-07-24"), // 3
            ("3", "1", "1949-08-06")  // 4 first consecutives win

我需要这样的结果

            From            To          games_won

            1949-06-12  1949-08-06          4
            1945-11-04  1946-11-17          3
            1943-10-03  1943-10-10          2
            ...

...

【问题讨论】:

    标签: mysql date count rows


    【解决方案1】:

    您可以使用变量计算获胜次数和行数。连续获胜的差异是恒定的。这为您提供了一个聚合值以获得最终结果:

    select min(played), max(played), count(*)
    from (select g.*,
                 (@rn := @rn + 1) as rn,
                 (@rnw := if(value1 > value2, @rnw + 1, @rnw) as rnw
          from games g cross join
               (select @rn := 0, @rnw := 0) params
          order by played
         ) g
    where value1 > value2
    group by (rn - rnw);
    

    【讨论】:

    • Gordon Linoff,我将 ) 添加到第 4 行。 (@rnw := if(value1 > value2, @rnw + 1, @rnw)) 作为 rnw 并将订单和限制添加到最后一行group by (rn - rnw) order by count(*) desc,玩过 ASC 限制 10;再次感谢。
    猜你喜欢
    • 2017-05-16
    • 2019-06-22
    • 1970-01-01
    • 1970-01-01
    • 2021-10-12
    • 1970-01-01
    • 2021-02-03
    • 2019-12-04
    • 1970-01-01
    相关资源
    最近更新 更多