Mysql - 计算条件连续的日期并获取范围列表
Mysql - Count date consecutive with condition and get range list
我需要知道一支球队连续赢了多少天 (value1 > value2),并知道第一场和最后一场比赛获胜的日期。并显示按获胜日期和日期排序的 10 个范围的列表。
我知道这并不容易。这对我来说并不容易。我尝试进行一些查询和子查询,但没有很好的结果。谢谢
我有一个table和
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
...
...
您可以使用变量计算获胜次数和行数。连续获胜的差异是恒定的。这为您提供了聚合值以获得最终结果:
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);
我需要知道一支球队连续赢了多少天 (value1 > value2),并知道第一场和最后一场比赛获胜的日期。并显示按获胜日期和日期排序的 10 个范围的列表。 我知道这并不容易。这对我来说并不容易。我尝试进行一些查询和子查询,但没有很好的结果。谢谢 我有一个table和
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
...
...
您可以使用变量计算获胜次数和行数。连续获胜的差异是恒定的。这为您提供了聚合值以获得最终结果:
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);