CDA持证人阿涛哥

2021-01-04   阅读量: 3382

Mysql

SQL题目之连续7天及以上有无订单的用户ID,对应起止时间,持续天数

扫码加入数据分析学习群

题目:


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,对应起止时间,持续天数


添加CDA认证专家【维克多阿涛】,微信号:【cdashijiazhuang】,提供数据分析指导及CDA考试秘籍。已助千人通过CDA数字化人才认证。欢迎交流,共同成长!
0.0000 0 1 关注作者 收藏

评论(1)

CDA持证人阿涛哥
2021-01-31
###问题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;


0.0000 0 0 回复

推荐课程

推荐帖子