题目:
create database ccc;
use ccc;
create table order_info(
c_id varchar(10),
c_name varchar(10),
city_id varchar(10),
city_name varchar(10),
order_id varchar(10),
order_date date
);
insert into order_info values
('111','王**','32','厦门市','12233',"2017-07-01"),
('111','王**','32','厦门市','12234',"2017-07-02"),
('111','王**','32','厦门市','12235',"2017-07-03"),
('111','王**','32','厦门市','12236',"2017-07-03"),
('111','王**','32','厦门市','12237',"2017-7-3"),
('111','王**','32','厦门市','12238',"2017-7-4"),
('111','王**','32','厦门市','12239',"2017-7-5"),
('111','王**','32','厦门市','12240',"2017-7-6"),
('111','王**','32','厦门市','12241',"2017-7-7"),
('111','王**','32','厦门市','12242',"2017-7-8"),
('111','王**','32','厦门市','12243',"2017-7-9"),
('111','王**','32','厦门市','12244',"2017-7-10"),
('111','王**','32','厦门市','12245',"2017-7-11"),
('111','王**','32','厦门市','12246',"2017-7-12"),
('202','林**','32','厦门市','32247',"2017-7-1"),
('202','林**','32','厦门市','32248',"2017-7-2"),
('202','林**','32','厦门市','32249',"2017-7-3"),
('202','林**','32','厦门市','32250',"2017-7-4"),
('202','林**','32','厦门市','32251',"2017-7-5"),
('202','林**','32','厦门市','32252',"2017-7-6"),
('202','林**','32','厦门市','32253',"2017-7-20"),
('203','刘**','32','厦门市','32254',"2017-7-10"),
('203','刘**','32','厦门市','32255',"2017-7-11");
###########################
###01 按照ID分类,按照日期排序号
###02 连续7天及以上无订单的用户ID,对应起止时间,持续天数
###03 连续7天及以上有订单的用户ID,对应起止时间,持续天数








###问题01 按照ID分类,按照日期排序号 SELECT c_id, ROW_NUMBER() OVER ( PARTITION BY k.c_id ORDER BY k.c_id, k.order_date ) sn , k.order_date FROM order_info k WHERE order_date BETWEEN '20170101' AND '20171231' GROUP BY k.c_id , order_date; ####练习 Select c_id ,row_number() over(partition by t.c_id order by t.order_date) 行序号, t.order_date From order_info t WHERE order_date BETWEEN "20170101" AND "20171231" GROUP BY t.c_id,t.order_date; ############################ ###问题02 连续7天及以上无订单的用户ID,对应起止时间,持续天数 with ks AS ( SELECT ROW_NUMBER() OVER ( PARTITION BY k.c_id ORDER BY k.c_id, k.order_date ) sn , k.c_id , k.order_date FROM order_info k WHERE order_date BETWEEN '20170101' AND '20171231' GROUP BY k.c_id , order_date ) #两条序号相邻订单日期差值大于7 SELECT a.c_id , a.order_date + 1 ksrq , b.order_date - 1 jsrq , timestampdiff(day, a.order_date, b.order_date)-1 ts FROM ks a , ks b WHERE a.c_id = b.c_id AND b.sn =a.sn + 1 AND timestampdiff(day, a.order_date, b.order_date) > 7; ##问题03,连续7天及以上有订单的用户ID,对应起止时间,持续天数 WITH ks #按人分组查询订单日期和序号 AS ( SELECT ROW_NUMBER() OVER ( PARTITION BY k.c_id ORDER BY k.c_id, k.order_date ) sn , k.c_id , k.order_date FROM order_info k WHERE order_date BETWEEN '20170101' AND '20171231' GROUP BY k.c_id, order_date ), tj #计算订单日期和其序号差值,差值相同的订单日期连续 AS ( SELECT c_id , order_date, order_date - sn diff , sn FROM ks ) SELECT c_id , diff , MIN(order_date) ksrq , MAX(order_date) jsrq , COUNT(1) ts #每出现一次1,连续1天 FROM tj GROUP BY c_id , diff HAVING COUNT(1) > 7 ORDER BY c_id , diff;