mysql一个连续日期(天)次数的统计
2015-09-18 00:00
579 查看
首先声明参考: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');
表如下
id uid date
1 1 2015-09-01
2 1 2015-09-02
17 1 2015-09-03
18 1 2015-09-05
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
首先,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
结果
uid date countday group_id last_uid last_date
1 2015-09-01 1 1 1 2015-09-01
1 2015-09-02 2 1 1 2015-09-02
1 2015-09-03 3 1 1 2015-09-03
1 2015-09-05 1 2 1 2015-09-05
2 2015-09-01 1 3 2 2015-09-01
2 2015-09-02 2 3 2 2015-09-02
2 2015-09-03 3 3 2 2015-09-03
2 2015-09-04 4 3 2 2015-09-04
3 2015-09-01 1 4 3 2015-09-01
3 2015-09-02 2 4 3 2015-09-02
3 2015-09-03 3 4 3 2015-09-03
3 2015-09-04 4 4 3 2015-09-04
4 2015-09-01 1 5 4 2015-09-01
4 2015-09-02 2 5 4 2015-09-02
5 2015-09-01 1 6 5 2015-09-01
5 2015-09-02 2 6 5 2015-09-02
6 2015-09-01 1 7 6 2015-09-01
6 2015-09-02 2 7 6 2015-09-02
7 2015-09-01 1 8 7 2015-09-01
7 2015-09-02 2 8 7 2015-09-02
8 2015-09-01 1 9 8 2015-09-01
8 2015-09-02 2 9 8 2015-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
最终结果(countday 连续天数)
uid mindate maxdate countday dates
1 2015-09-01 2015-09-03 3 2015-09-01,2015-09-02,2015-09-03
1 2015-09-05 2015-09-05 1 2015-09-05
2 2015-09-01 2015-09-04 4 2015-09-03,2015-09-04,2015-09-01,2015-09-02
3 2015-09-01 2015-09-04 4 2015-09-03,2015-09-04,2015-09-01,2015-09-02
4 2015-09-01 2015-09-02 2 2015-09-02,2015-09-01
5 2015-09-01 2015-09-02 2 2015-09-01,2015-09-02
6 2015-09-01 2015-09-02 2 2015-09-01,2015-09-02
7 2015-09-01 2015-09-02 2 2015-09-01,2015-09-02
8 2015-09-01 2015-09-02 2 2015-09-01,2015-09-02
表定义
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');
表如下
id uid date
1 1 2015-09-01
2 1 2015-09-02
17 1 2015-09-03
18 1 2015-09-05
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
首先,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
结果
uid date countday group_id last_uid last_date
1 2015-09-01 1 1 1 2015-09-01
1 2015-09-02 2 1 1 2015-09-02
1 2015-09-03 3 1 1 2015-09-03
1 2015-09-05 1 2 1 2015-09-05
2 2015-09-01 1 3 2 2015-09-01
2 2015-09-02 2 3 2 2015-09-02
2 2015-09-03 3 3 2 2015-09-03
2 2015-09-04 4 3 2 2015-09-04
3 2015-09-01 1 4 3 2015-09-01
3 2015-09-02 2 4 3 2015-09-02
3 2015-09-03 3 4 3 2015-09-03
3 2015-09-04 4 4 3 2015-09-04
4 2015-09-01 1 5 4 2015-09-01
4 2015-09-02 2 5 4 2015-09-02
5 2015-09-01 1 6 5 2015-09-01
5 2015-09-02 2 6 5 2015-09-02
6 2015-09-01 1 7 6 2015-09-01
6 2015-09-02 2 7 6 2015-09-02
7 2015-09-01 1 8 7 2015-09-01
7 2015-09-02 2 8 7 2015-09-02
8 2015-09-01 1 9 8 2015-09-01
8 2015-09-02 2 9 8 2015-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 连续天数)
uid mindate maxdate countday dates
1 2015-09-01 2015-09-03 3 2015-09-01,2015-09-02,2015-09-03
1 2015-09-05 2015-09-05 1 2015-09-05
2 2015-09-01 2015-09-04 4 2015-09-03,2015-09-04,2015-09-01,2015-09-02
3 2015-09-01 2015-09-04 4 2015-09-03,2015-09-04,2015-09-01,2015-09-02
4 2015-09-01 2015-09-02 2 2015-09-02,2015-09-01
5 2015-09-01 2015-09-02 2 2015-09-01,2015-09-02
6 2015-09-01 2015-09-02 2 2015-09-01,2015-09-02
7 2015-09-01 2015-09-02 2 2015-09-01,2015-09-02
8 2015-09-01 2015-09-02 2 2015-09-01,2015-09-02
相关文章推荐
- mysql体系结构之不得不说
- [转]101个MySQL开源数据库调试和优化技巧
- mysql 记录语句记录
- WAS学习笔记之配置MySQL数据源
- Keepalived+MySQL(双主热备)
- Windows下一个MySQL有些错误的解决方法
- MySQL查询
- MySQL数据库链接问题及密码修改
- mysql解压版安装与使用-2015-09-17
- MySQL查看所有可用的字符集
- MySQL学习1_Win7下安装MySQL5.6.26
- LNMP之Mysql主从复制(四)
- mysql错误-更改mysql.sock位置
- mysql 查询问题集合
- Mysql数据库的内外联查询
- 深入浅出Mysql(一)
- MySQL获取表格信息
- mysql导出表结构
- geoserver使用mysql数据源的注意事项
- hibernate Mysql 自增长 注解配置,表无关联的注解方式关联查询