在任何三天休息之后,使用mysql按日期计算连续条纹

时间:2013-01-08 16:47:40

标签: mysql

我有一个数据库表,可以使用我的应用程序跟踪人员。每个用户每天可能有多种用途。因此,给定单个用户的示例记录集可能如下所示:

userId  dateOfUsage
1       2012-12-01
1       2012-12-02
1       2012-12-02
1       2012-12-03
1       2012-12-06
1       2012-12-07
1       2012-12-07
1       2012-12-08

我们今天说的是2012-12-08。我希望在没有条目的三天或更长时间之后得到今天和最后一条记录之间的天数。在上面的例子中,2012-12-03和2012-12-06之间有一个休息时间,所以我想计算2012-12-06和今天(2012-12-08)之间的日子。答案是6日到8日的“3天连胜”。

是否可以仅在MySQL中执行此操作?我如何为MySQL中的给定用户执行此操作?是否可以同时为所有用户执行此操作?

我发现了关于条纹的其他问题,但没有任何运气适应它们来解决我的请求。谢谢!

2 个答案:

答案 0 :(得分:0)

您可以使用cursors的存储过程创建临时表。

或者你可以做类似

的事情
set @dateOfUsage = NULL;
SELECT * FROM (
  SELECT IF(@dateOfUsage IS NULL, 0, datediff(dateOfUsage, @dateOfUsage)) as gap, @dateOfUsage:=dateOfUsage AS dateOfUsage FROM (
    SELECT * FROM `usage` WHERE userID = 1 ORDER BY dateOfUsage
  ) `usage`
) `t` WHERE gap >= 3;

http://sqlfiddle.com/#!2/22228/2

请注意,您需要使用子查询,因为表中行的顺序不受保证。

我需要另一个子查询来过滤(虽然我没有用户认为HAVING不会这样做。)

答案 1 :(得分:0)

如果您愿意,请过滤用户...

DROP TABLE IF EXISTS my_table;

CREATE TABLE my_table 
(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY
,userId  INT NOT NULL
,dateOfUsage DATE NOT NULL
);

INSERT INTO my_table (userid,dateofusage) VALUES
(1       ,'2012-12-01'),
(1       ,'2012-12-02'),
(1       ,'2012-12-02'),
(1       ,'2012-12-03'),
(2       ,'2012-12-04'),
(2       ,'2012-12-05'),
(1       ,'2012-12-06'),
(1       ,'2012-12-07'),
(1       ,'2012-12-07'),
(1       ,'2012-12-08');

SELECT DATEDIFF('2012-12-08',MAX(b.dateofusage))+1 streak  
  FROM ( SELECT x.*, COUNT(*) rank FROM my_table x JOIN my_table y ON y.userid = x.userid AND y.id <= x.id GROUP BY x.id) a
  JOIN ( SELECT x.*, COUNT(*) rank FROM my_table x JOIN my_table y ON y.userid = x.userid AND y.id <= x.id GROUP BY x.id) b
    ON b.dateofusage >= a.dateofusage + INTERVAL 3 DAY
   AND b.rank = a.rank + 1
   AND b.userid = a.userid
 GROUP
    BY a.userid;