MySQLʵսںSQL༶ѧԳɼ |
一、背景介?/h2>今天,野鸡大学高(三)班的月考成绩出来了,这里先给大家公布一下各位同学的考试成绩?/p> 接着,在给大家公布一下各位同学的生活消费情况?/p> 下面我们利用上述考试成绩和生活消费记录,利用mysql做一个简单的分析?/p> 当然,从本文标题就可以看出来。本文就是要结合这份数据,为大家讲述SQL “窗口函数?应该怎么用? 包括你以后学习hive或者oracle数据库,或者说数据分析面试,这都将是一个很重要的知识点?/p> 二、建表语句和插入数据创建表格create table exam_score( sname varchar(20), age int, subject varchar(20), score varchar(20) )charset=utf8; # ----------------------- # create table cost_fee( sname varchar(20), buydate varchar(20), buycost int )charset=utf8; 插入数据insert into exam_score values ('张三' , 18, '语文' , 90), ('张三' , 18, '数学' , 80), ('张三' , 18, '英语' , 70), ('李四' , 21, '语文' , 88), ('李四' , 21, '数学' , 78), ('李四' , 21, '英语' , 71), ('王五' , 18, '语文' , 95), ('王五' , 18, '数学' , 83), ('王五' , 18, '英语' , 71), ('赵六' , 19, '语文' , 98), ('赵六' , 19, '数学' , 90), ('赵六' , 19, '英语' , 80); # ----------------------- # insert into cost_fee values ('张三','2019-01-01',10), ('张三','2019-03-03',23), ('张三','2019-02-05',46), ('李四','2019-02-02',15), ('李四','2019-01-07',50), ('李四','2019-03-04',29), ('王五','2019-03-08',62), ('王五','2019-02-09',68), ('王五','2019-01-11',75), ('赵六','2019-02-08',55), ('赵六','2019-03-10',12), ('赵六','2019-01-12',80); 三、窗口函数分类介?/h2>在正式讲?“窗口函数?应用之前,我这里先带着大家梳理一?“窗口函数?的基础。我们可以将窗口函数分为如下几类?/p> 聚合函数 + over()搭配?/p> 排序函数 + over()搭配?/p> ntile()函数 + over()搭配?/p> 偏移函数 + over()搭配?/p> 具体每一类,有哪些函数呢?观察下面的思维导图?/p> 对于over()里面,这里还有两个常用的关键字,必须要讲述。如下: partition by + 字段:你可以想象成group by关键字,就是用于 ?/strong>分组?的关键字?/p>
order by + 字段:这个更容易理解,就是用?“排序?的关键字?/p>
上面给大家介绍了若干常用?“窗口函数”,这里利用文首创建的数据,讲讲 “窗口函数?的应用?/p>
希望大家通过每个案例,来总结一下每个函数的含义,这里就不详细写了?/p>
?计算每位同学的得分与平均值的情况 结果如下?/p>
?计算每位同学1-3月消费情况和消费总额 结果如下?/p>
?计算每位同学1-3月消费情况和累计消费总额 结果如下?/p>
注意?结合②③,大家可以发现partition by结合order by,与不结合order by,得到的完全是不同的结果。一个是分组求总和(不加order by);一个是分组求累计和(加order by)?/p>
?计算每个科目的排名,相同的分数排名不同,顺序依次增加 结果如下?/p>
?计算每个科目的排名,相同的分数排名相同,余下排名跳跃增加 结果如下?/p>
?计算每个科目的排名,相同的分数排名相同,余下排名顺序增加 结果如下?/p>
ntile()函数有点乱入的感觉,你不知道给它分哪一类。该函数主要??/strong>数据切分”。如果说这个函数还有点用的话,就是他也可以对数据进行排序,类似于上面提到的row_number()函数?/p>
?对exam_score表,进行整张表切?/p>
结果如下?/p>
不信你下去试一下,ntile()里面不管写哪个数字,好像都可以?/p>
?对exam_score表,按照subject分组切分 结果如下?/p>
即使是分组切分,你也会发现,这样毫无意义,因为score并没有排序?/p>
?对exam_score表,对score排序后,按照subject分组切分(最有用?/p>
结果如下?/p>
注意?仔细观察这种用法,基本可以等效row_number()函数,效果是一样的?/p>
?展示各位同学的“上次购买时间”和“下次购买时间?/p>
注:对于第一天,显示 “first buy”;对于最后一天,显示 “last buy?/strong>?/p>
结果如下?/p>
?截止到当前日期,每位同学的“首次购买时间”和“最后一次购买时间?/p>
结果如下?/p>
?展示每位同学的“首次购买时间”和“最后一次购买时间?/p>
注意?这里并没有说 “截止到当前日期”,请注意②③之间的区别呀。需求不同,结果就不同?/p>
结果如下?/p>
以上就是MySQL实战窗口函数SQL分析班级学生考试成绩及生活消费的详细内容,更多关于SQL窗口函数分析成绩及消费的资料请关注脚本之家其它相关文章! |