mysql计算连续次数_mysql一个连续日期(天)次数的统计

这篇博客介绍了如何使用MySQL查询来计算用户连续日期的次数。通过示例表`date_add`展示了数据结构,并提供了插入数据的语句。然后利用变量和条件判断,计算每个用户的连续日期天数,并展示出连续的日期范围和天数。最后,通过聚合函数获取每个连续日期段的最小日期、最大日期、最大连续天数和日期列表。
摘要由CSDN通过智能技术生成

首先声明参考:http://www.oschina.net/question/573517_118821

表定义

CREATE TABLE `date_add` (

`id` int(11) NOT NULL AUTO_INCREMENT,

`uid` int(11) NOT NULL DEFAULT '0',

`date` date NOT NULL,

PRIMARY KEY (`id`),

UNIQUE KEY `idx_ud` (`uid`,`date`)

) ENGINE=InnoDB AUTO_INCREMENT=23 DEFAULT CHARSET=latin1

插入语句

INSERT INTO `date_add` (`id`, `uid`, `date`) VALUES

(1, 1, '2015-09-01'),

(2, 1, '2015-09-02'),

(17, 1, '2015-09-03'),

(18, 1, '2015-09-04'),

(3, 2, '2015-09-01'),

(4, 2, '2015-09-02'),

(19, 2, '2015-09-03'),

(20, 2, '2015-09-04'),

(5, 3, '2015-09-01'),

(6, 3, '2015-09-02'),

(21, 3, '2015-09-03'),

(22, 3, '2015-09-04'),

(7, 4, '2015-09-01'),

(8, 4, '2015-09-02'),

(9, 5, '2015-09-01'),

(10, 5, '2015-09-02'),

(11, 6, '2015-09-01'),

(12, 6, '2015-09-02'),

(13, 7, '2015-09-01'),

(14, 7, '2015-09-02'),

(15, 8, '2015-09-01'),

(16, 8, '2015-09-02');

表如下

iduiddate

112015-09-01

212015-09-02

1712015-09-03

1812015-09-05

322015-09-01

422015-09-02

1922015-09-03

2022015-09-04

532015-09-01

632015-09-02

2132015-09-03

2232015-09-04

742015-09-01

842015-09-02

952015-09-01

1052015-09-02

1162015-09-01

1262015-09-02

1372015-09-01

1472015-09-02

1582015-09-01

1682015-09-02

首先,sql如下

select uid,`date`,@countday:=(case when(@last_uid:=uid and DATEDIFF(`date`,@last_date)=1)then (@countday+1)else 1 end ) as countday ,(@group_id:=(@group_id+if(@countday=1,1,0))) asgroup_id,@last_uid:=uid as last_uid,@last_date:=`date` as last_date from (select `uid`,`date` from date_add order by uid,`date` )as t1,(select@countday:=0,@group_id:=0,@last_uid:='',@last_date:='') as t2

select uid,`date`,@countday:=(case when(@last_uid:=uid and DATEDIFF(`date`,@last_date)=1)then (@countday+1)else 1 end ) as countday ,(@group_id:=(@group_id+if(@countday=1,1,0))) asgroup_id,@last_uid:=uid as last_uid,@last_date:=`date` as last_date from (select `uid`,`date` from date_add order by uid,`date` )as t1,(select@countday:=0,@group_id:=0,@last_uid:='',@last_date:='') as t2

结果

uiddatecountdaygroup_idlast_uidlast_date

12015-09-011112015-09-01

12015-09-022112015-09-02

12015-09-033112015-09-03

12015-09-051212015-09-05

22015-09-011322015-09-01

22015-09-022322015-09-02

22015-09-033322015-09-03

22015-09-044322015-09-04

32015-09-011432015-09-01

32015-09-022432015-09-02

32015-09-033432015-09-03

32015-09-044432015-09-04

42015-09-011542015-09-01

42015-09-022542015-09-02

52015-09-011652015-09-01

52015-09-022652015-09-02

62015-09-011762015-09-01

62015-09-022762015-09-02

72015-09-011872015-09-01

72015-09-022872015-09-02

82015-09-011982015-09-01

82015-09-022982015-09-02

然后,sql

select uid,min(date) as mindate , max(date) as maxdate,max(countday) countday,group_concat(date) dates from ( select uid,`date`,@countday:=(case when(@last_uid:=uid andDATEDIFF(`date`,@last_date)=1)then (@countday+1)else 1 end ) as countday ,(@group_id:=(@group_id+if(@countday=1,1,0))) as group_id,@last_uid:=uid as last_uid,@last_date:=`date` aslast_date from (select `uid`,`date` from date_add order by uid,`date` )as t1,(select @countday:=0,@group_id:=0,@last_uid:='',@last_date:='') as t2) as t3 group by group_id

select uid,min(date) as mindate , max(date) as maxdate,max(countday) countday,group_concat(date) dates from ( select uid,`date`,@countday:=(case when(@last_uid:=uid andDATEDIFF(`date`,@last_date)=1)then (@countday+1)else 1 end ) as countday ,(@group_id:=(@group_id+if(@countday=1,1,0))) as group_id,@last_uid:=uid as last_uid,@last_date:=`date` aslast_date from (select `uid`,`date` from date_add order by uid,`date` )as t1,(select @countday:=0,@group_id:=0,@last_uid:='',@last_date:='') as t2) as t3 group by group_id

最终结果(countday 连续天数)

uidmindatemaxdatecountdaydates

12015-09-012015-09-0332015-09-01,2015-09-02,2015-09-03

12015-09-052015-09-0512015-09-05

22015-09-012015-09-0442015-09-03,2015-09-04,2015-09-01,2015-09-02

32015-09-012015-09-0442015-09-03,2015-09-04,2015-09-01,2015-09-02

42015-09-012015-09-0222015-09-02,2015-09-01

52015-09-012015-09-0222015-09-01,2015-09-02

62015-09-012015-09-0222015-09-01,2015-09-02

72015-09-012015-09-0222015-09-01,2015-09-02

82015-09-012015-09-0222015-09-01,2015-09-02

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用 MySQL日期函数和子查询实现连续日期统计,具体步骤如下: 1. 构造一个包含所有需要统计日期的临时表,可以使用 UNION ALL 来实现,例如统计从 2022-01-01 到 2022-01-31 的日期: ``` SELECT DATE('2022-01-01') AS date UNION ALL SELECT DATE('2022-01-02') UNION ALL SELECT DATE('2022-01-03') ... UNION ALL SELECT DATE('2022-01-31'); ``` 2. 使用子查询查询连续出现的数,首先需要找到每个连续日期段的起始日期和结束日期,可以通过自连接的方式实现。假设有一个名为 `date_table` 的表存储了所有需要统计日期,可以使用以下 SQL 语句查询连续日期段: ``` SELECT a.date AS start_date, MIN(c.date) AS end_date FROM date_table a LEFT JOIN date_table b ON b.date = DATE_SUB(a.date, INTERVAL 1 DAY) LEFT JOIN date_table c ON c.date = DATE_ADD(a.date, INTERVAL 1 DAY) WHERE b.date IS NULL OR c.date IS NULL GROUP BY a.date; ``` 上述 SQL 语句会找到所有连续出现的日期段的起始日期和结束日期,例如: ``` +------------+------------+ | start_date | end_date | +------------+------------+ | 2022-01-01 | 2022-01-01 | | 2022-01-02 | 2022-01-03 | | 2022-01-04 | 2022-01-04 | | 2022-01-07 | 2022-01-08 | | 2022-01-09 | 2022-01-09 | | 2022-01-10 | 2022-01-10 | +------------+------------+ ``` 3. 使用上一步查询到的连续日期段,结合日期函数和 GROUP BY 子句,统计每个连续日期段内的数: ``` SELECT start_date, end_date, COUNT(*) AS count FROM ( SELECT a.date AS start_date, MIN(c.date) AS end_date FROM date_table a LEFT JOIN date_table b ON b.date = DATE_SUB(a.date, INTERVAL 1 DAY) LEFT JOIN date_table c ON c.date = DATE_ADD(a.date, INTERVAL 1 DAY) WHERE b.date IS NULL OR c.date IS NULL GROUP BY a.date ) AS t JOIN date_table d ON d.date BETWEEN t.start_date AND t.end_date GROUP BY start_date, end_date; ``` 上述 SQL 语句会输出每个连续日期段的起始日期、结束日期连续出现的数,例如: ``` +------------+------------+-------+ | start_date | end_date | count | +------------+------------+-------+ | 2022-01-01 | 2022-01-01 | 1 | | 2022-01-02 | 2022-01-03 | 2 | | 2022-01-04 | 2022-01-04 | 1 | | 2022-01-07 | 2022-01-08 | 2 | | 2022-01-09 | 2022-01-09 | 1 | | 2022-01-10 | 2022-01-10 | 1 | +------------+------------+-------+ ``` 注意,上述 SQL 语句中的 `date_table` 表需要根据实际情况替换为实际的表名或子查询。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值