暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL 高级SQL进阶真题讲解(一)

原创 aisql 2023-07-27
354
一、题目描述

D8W7K8RCQ5985GFX1O.png

二、数据构建
drop table if exists author_tb; CREATE TABLE author_tb( author_id int(10) NOT NULL, author_level int(10) NOT NULL, sex char(10) NOT NULL); INSERT INTO author_tb VALUES(101 , 6, 'm'); INSERT INTO author_tb VALUES(102 , 1, 'f'); INSERT INTO author_tb VALUES(103 , 1, 'm'); INSERT INTO author_tb VALUES(104 , 3, 'm'); INSERT INTO author_tb VALUES(105 , 4, 'f'); INSERT INTO author_tb VALUES(106 , 2, 'f'); INSERT INTO author_tb VALUES(107 , 2, 'm'); INSERT INTO author_tb VALUES(108 , 5, 'f'); INSERT INTO author_tb VALUES(109 , 6, 'f'); INSERT INTO author_tb VALUES(110 , 5, 'm'); drop table if exists answer_tb; CREATE TABLE answer_tb( answer_date date NOT NULL, author_id int(10) NOT NULL, issue_id char(10) NOT NULL, char_len int(10) NOT NULL); INSERT INTO answer_tb VALUES('2021-11-1', 101, 'E001' ,150); INSERT INTO answer_tb VALUES('2021-11-1', 101, 'E002', 200); INSERT INTO answer_tb VALUES('2021-11-1',102, 'C003' ,50); INSERT INTO answer_tb VALUES('2021-11-1' ,103, 'P001', 35); INSERT INTO answer_tb VALUES('2021-11-1', 104, 'C003', 120); INSERT INTO answer_tb VALUES('2021-11-1' ,105, 'P001', 125); INSERT INTO answer_tb VALUES('2021-11-1' , 102, 'P002', 105); INSERT INTO answer_tb VALUES('2021-11-2', 101, 'P001' ,201); INSERT INTO answer_tb VALUES('2021-11-2', 110, 'C002', 200); INSERT INTO answer_tb VALUES('2021-11-2', 110, 'C001', 225); INSERT INTO answer_tb VALUES('2021-11-2' , 110, 'C002', 220); INSERT INTO answer_tb VALUES('2021-11-3', 101, 'C002', 180); INSERT INTO answer_tb VALUES('2021-11-4' ,109, 'E003', 130); INSERT INTO answer_tb VALUES('2021-11-4', 109, 'E001',123); INSERT INTO answer_tb VALUES('2021-11-5', 108, 'C001',160); INSERT INTO answer_tb VALUES('2021-11-5', 108, 'C002', 120); INSERT INTO answer_tb VALUES('2021-11-5', 110, 'P001', 180); INSERT INTO answer_tb VALUES('2021-11-5' , 106, 'P002' , 45); INSERT INTO answer_tb VALUES('2021-11-5' , 107, 'E003', 56);
三、题目答案
with cte1 as ( select author_id,answer_date from answer_tb group by author_id,answer_date ) , cte2 as ( select *, datediff(answer_date,lag(answer_date) over(partition by author_id order by answer_date)) as flag from cte1 ) ,cte3 as ( select * , case when flag = 1 then @inc := @inc + 1 else @inc :=1 end as inc from cte2,(select @inc := 0) as t ) select a.author_id,b.author_level,max(a.inc) cnt from cte3 as a inner join author_tb b on a.author_id = b.author_id group by a.author_id,b.author_level having cnt >= 3

5~FG8_LRP.png

四、题目讲解

第一步

with cte1 as ( select author_id,answer_date from answer_tb group by author_id,answer_date )

最终求连续天数,同一天的留一条SQL就可以了。所以这条语句就是按author_id与answer_date分组 group 去重。
第二步

cte2 as ( select *, datediff(answer_date,lag(answer_date) over(partition by author_id order by answer_date)) as flag from cte1 )

第二步,利用窗口函数求出每个 author_id 的每一行与上一行的时间间隔。= 1 就代表是连续的

第三步

cte3 as ( select * , case when flag = 1 then @inc := @inc + 1 else @inc :=1 end as inc from cte2,(select @inc := 0) as t )

利用虚拟表,与伪列。算出连续天数 inc就为连续的天数
第四步。

select a.author_id,b.author_level,max(a.inc) cnt from cte3 as a inner join author_tb b on a.author_id = b.author_id group by a.author_id,b.author_level having cnt >= 3

取最大的连续天数,且大于3天的数据展示出来。

对第二步开窗函数不熟悉的可参考我的开窗函数专辑说明
开窗函数

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论