MySQLʵս´°¿Úº¯ÊýSQL·ÖÎö°à¼¶Ñ§Éú¿¼ÊԳɼ¨¼°Éú»îÏû·Ñ


一�背景介�/h2>

今天,野鸡大学高(三)�的月考�绩出�了,这里先给大家公布一下���学的考试�绩�/p>

在这里�入图片�� src=

接�,在给大家公布一下���学的生活消费情况�/p>

在这里�入图片�� src=

下�我们利用上述考试�绩和生活消费记录,利用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>

在这里�入图片�� src=

对于over()里�,这里还有两个常用的关键字,必须�讲述。如下:

partition by + 字段:你�以想象�group by关键字,就是用于 �/strong>分组�的关键字�/p>

order by + 字段:这个更容易�解,就是用�“排��的关键字�/p>

四�窗�函数应�/h2>

上�给大家介�了若干常用�“窗�函数�,这里利用文首创建的数�,讲讲 “窗�函数�的应用�/p>

希望大家通过�个案例,�总结一下�个函数的�义,这里就�详细写了�/p>

1. ��函数 + over()��

�计算���学的得分与平�值的情况

select 
	sname
    ,subject
    ,score
    ,avg(score) over(partition by sname) as avg_score
from
	exam_score

结果如下�/p>

在这里�入图片�� src=

�计算���学1-3月消费情况和消费总�

select
	sname
    ,buydate
    ,buycost
    ,sum(buycost) over(partition by sname) as sum_cost
from
	cost_fee

结果如下�/p>

在这里�入图片�� src=

�计算���学1-3月消费情况和累计消费总�

select
	sname
    ,buydate
    ,buycost
    ,sum(buycost) over(partition by sname order by buydate) as sum_cost
from
	cost_fee

结果如下�/p>

在这里�入图片�� src=

注��结�②③,大家�以�现partition by结�order by,与�结�order by,得到的完全是��的结果。一个是分组求总和(�加order by);一个是分组求累计和(加order by)�/p>

2. 排�函数 + over()��

�计算�个科目的排�,相�的分数排���,顺��次增加

select
	sname
	,subject
	,score
    ,row_number() over(partition by subject order by score) rank1
from
	exam_score

结果如下�/p>

在这里�入图片�� src=

�计算�个科目的排�,相�的分数排�相�,余下排�跳跃增加

select
	sname
	,subject
	,score
    ,rank() over(partition by subject order by score) rank1
from
	exam_score

结果如下�/p>

在这里�入图片�� src=

�计算�个科目的排�,相�的分数排�相�,余下排�顺�增加

select
	sname
	,subject
	,score
    ,dense_rank() over(partition by subject order by score) rank1
from
	exam_score

结果如下�/p>

在这里�入图片�� src=

3. ntile()函数 + over()��

ntile()函数有点乱入的感觉,你�知�给它分哪一类。该函数主���/strong>数�切分�。如果说这个函数还有点用的�,就是他也�以对数�进行排�,类似于上��到的row_number()函数�/p>

�对exam_score表,进行整张表切�/p>

select
	sname
	,subject
	,score
    ,ntile(4) over() rank1
from
	exam_score

结果如下�/p>

在这里�入图片�� src=

�信你下去试一下,ntile()里��管写哪个数字,好�都�以�/p>

�对exam_score表,按照subject分组切分

select
	sname
	,subject
    ,score
    ,ntile(4) over(partition by subject) rank1
from
	exam_score

结果如下�/p>

在这里�入图片�� src=

�使是分组切分,你也会�现,这样毫无�义,因为score并没有排��/p>

�对exam_score表,对score排��,按照subject分组切分(最有用�/p>

select
	sname
	,subject
    ,score
    ,ntile(4) over(partition by subject order by score) rank1
from
	exam_score

结果如下�/p>

在这里�入图片�� src=

注��仔细观察这�用法,基本�以等效row_number()函数,效果是一样的�/p>

4. �移函数 + over()��

�展示���学的“上次购买时间�和“下次购买时间�/p>

注:对于第一天,显示 “first buy�;对于最�一天,显示 “last buy�/strong>�/p>

select
	sname
	,buydate
    ,lag(buydate,1,'first day') over(partition by sname order by buydate) as 上次购买时间
    ,lead(buydate,1,'last day') over(partition by sname order by buydate) as 下次购买时间
from
	cost_fee

结果如下�/p>

在这里�入图片�� src=

�截止到当�日期,���学的“首次购买时间�和“最�一次购买时间�/p>

select
	sname
	,buydate
    ,first_value(buydate) over(partition by sname order by buydate) as 首次购买时间
    ,last_value(buydate) over(partition by sname order by buydate) as 最�一次购买时�
from
	cost_fee

结果如下�/p>

在这里�入图片�� src=

�展示���学的“首次购买时间�和“最�一次购买时间�/p>

注��这里并没有说 “截止到当�日期�,请注�②③之间的区别呀。需求��,结果就���/p>

select
	sname
	,buydate
    ,first_value(buydate) over(partition by sname order by buydate) as 首次购买时间
    ,last_value(buydate) over(partition by sname ) as 最�一次购买时�
from
	cost_fee

结果如下�/p>

在这里�入图片�� src=

以上就是MySQL实战窗�函数SQL分��级学生考试�绩�生活消费的详细内容,更多关于SQL窗�函数分��绩�消费的资料请关注脚本之家其它相关文章�