使用MySQL计算连续的日条纹

时间:2018-10-20 19:16:18

标签: php mysql database mysql-5.7

我有下表:

Date       | isDone
--------------------
2018-10-01 | 1
2018-10-02 | 1
2018-10-03 | 1
2018-10-04 | 1 
2018-10-10 | 0
2018-10-15 | 1
2018-10-16 | 0
2018-10-18 | 1
2018-10-19 | 1
2018-10-20 | 1

每天只能有一行,其中2个可能的值是0或1。一天中不一定要有一行。如果一天没有一行,则该值将被视为0。

我想从当前日期开始计算已完成任务的“当前条纹”(isDone列)。假设我们是2018年10月20日,结果将为 3 。目前,我不想计算本月的最大涨幅,在这种情况下为 4 (从2018-10-01到2018-10-04)。我想知道直接使用SQL(MySQL 5.7)或每天获取原始数据并使用PHP计算条纹的最佳选择是什么?

1 个答案:

答案 0 :(得分:2)

您可以使用MySQL变量来计算条纹。基本上,您需要在isDone为1时连续几天增加连胜,并在isDone为0或日期不连续时重置连胜。该查询将产生每天的条纹值:

SELECT s.Date,
       @streak := IF(Date = @last_date + INTERVAL 1 DAY AND isDone = 1, @streak+1, 1) AS streak,
       @last_date := Date AS last_date
FROM status s
JOIN (SELECT @streak := 0, @last_date := '1900-01-01') i
ORDER BY s.Date

输出:

Date        streak  last_date
2018-10-01  1       2018-10-01
2018-10-02  2       2018-10-02
2018-10-03  3       2018-10-03
2018-10-04  4       2018-10-04
2018-10-10  1       2018-10-10
2018-10-15  1       2018-10-15
2018-10-16  1       2018-10-16
2018-10-18  1       2018-10-18
2018-10-19  2       2018-10-19
2018-10-20  3       2018-10-20

然后,您可以将其用作子查询来确定给定日期的连胜情况,例如

SELECT Date, streak
FROM (SELECT s.Date,
             @streak := IF(Date = @last_date + INTERVAL 1 DAY AND isDone = 1, @streak+1, 1) AS streak,
             @last_date := Date AS last_date
      FROM status s
      JOIN (SELECT @streak := 0, @last_date := '1900-01-01') i
      ORDER BY s.Date) s
WHERE s.Date = '2018-10-20'

输出:

Date        streak
2018-10-20  3

Demo on dbfiddle