激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數據庫技術|

服務器之家 - 數據庫 - Mysql - MySQL實戰窗口函數SQL分析班級學生考試成績及生活消費

MySQL實戰窗口函數SQL分析班級學生考試成績及生活消費

2021-11-24 17:41數據分析與統計學之美 Mysql

這篇文章主要為大家介紹了MySQL實戰,利用窗口函數SQL來分析班級學生的考試成績及生活消費的示例過程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步

 

一、背景介紹

今天,野雞大學高(三)班的月考成績出來了,這里先給大家公布一下各位同學的考試成績。

MySQL實戰窗口函數SQL分析班級學生考試成績及生活消費

接著,在給大家公布一下各位同學的生活消費情況。

MySQL實戰窗口函數SQL分析班級學生考試成績及生活消費

下面我們利用上述考試成績和生活消費記錄,利用mysql做一個簡單的分析。

當然,從本文標題就可以看出來。本文就是要結合這份數據,為大家講述SQL “窗口函數” 應該怎么用?

包括你以后學習hive或者oracle數據庫,或者說數據分析面試,這都將是一個很重要的知識點。

 

二、建表語句和插入數據

 

創建表格

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);

 

三、窗口函數分類介紹

在正式講述 “窗口函數” 應用之前,我這里先帶著大家梳理一遍 “窗口函數” 的基礎。我們可以將窗口函數分為如下幾類:

聚合函數 + over()搭配;

排序函數 + over()搭配;

ntile()函數 + over()搭配;

偏移函數 + over()搭配;

具體每一類,有哪些函數呢?觀察下面的思維導圖。

MySQL實戰窗口函數SQL分析班級學生考試成績及生活消費

對于over()里面,這里還有兩個常用的關鍵字,必須要講述。如下:

partition by + 字段:你可以想象成group by關鍵字,就是用于 分組” 的關鍵字;

order by + 字段:這個更容易理解,就是用于 “排序” 的關鍵字;

 

 四、窗口函數應用

上面給大家介紹了若干常用的 “窗口函數”,這里利用文首創建的數據,講講 “窗口函數” 的應用。

希望大家通過每個案例,來總結一下每個函數的含義,這里就不詳細寫了。

 

1. 聚合函數 + over()搭配

① 計算每位同學的得分與平均值的情況

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

結果如下:

MySQL實戰窗口函數SQL分析班級學生考試成績及生活消費

② 計算每位同學1-3月消費情況和消費總額

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

結果如下:

MySQL實戰窗口函數SQL分析班級學生考試成績及生活消費

③ 計算每位同學1-3月消費情況和累計消費總額

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

結果如下:

MySQL實戰窗口函數SQL分析班級學生考試成績及生活消費

注意: 結合②③,大家可以發現partition by結合order by,與不結合order by,得到的完全是不同的結果。一個是分組求總和(不加order by);一個是分組求累計和(加order by)。

 

2. 排序函數 + over()搭配

① 計算每個科目的排名,相同的分數排名不同,順序依次增加

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

結果如下:

MySQL實戰窗口函數SQL分析班級學生考試成績及生活消費

② 計算每個科目的排名,相同的分數排名相同,余下排名跳躍增加

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

結果如下:

MySQL實戰窗口函數SQL分析班級學生考試成績及生活消費

③ 計算每個科目的排名,相同的分數排名相同,余下排名順序增加

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

結果如下:

MySQL實戰窗口函數SQL分析班級學生考試成績及生活消費

 

3. ntile()函數 + over()搭配

ntile()函數有點亂入的感覺,你不知道給它分哪一類。該函數主要用 數據切分”。如果說這個函數還有點用的話,就是他也可以對數據進行排序,類似于上面提到的row_number()函數。

① 對exam_score表,進行整張表切分

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

結果如下:

MySQL實戰窗口函數SQL分析班級學生考試成績及生活消費

不信你下去試一下,ntile()里面不管寫哪個數字,好像都可以。

② 對exam_score表,按照subject分組切分

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

結果如下:

MySQL實戰窗口函數SQL分析班級學生考試成績及生活消費

即使是分組切分,你也會發現,這樣毫無意義,因為score并沒有排序。

③ 對exam_score表,對score排序后,按照subject分組切分(最有用)

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

結果如下:

MySQL實戰窗口函數SQL分析班級學生考試成績及生活消費

注意: 仔細觀察這種用法,基本可以等效row_number()函數,效果是一樣的。

 

4. 偏移函數 + over()搭配

① 展示各位同學的“上次購買時間”和“下次購買時間”

注:對于第一天,顯示 “first buy”;對于最后一天,顯示 “last buy

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

結果如下:

MySQL實戰窗口函數SQL分析班級學生考試成績及生活消費

② 截止到當前日期,每位同學的“首次購買時間”和“最后一次購買時間”

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

結果如下:

MySQL實戰窗口函數SQL分析班級學生考試成績及生活消費

③ 展示每位同學的“首次購買時間”和“最后一次購買時間”

注意: 這里并沒有說 “截止到當前日期”,請注意②③之間的區別呀。需求不同,結果就不同。

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

結果如下:

MySQL實戰窗口函數SQL分析班級學生考試成績及生活消費

以上就是MySQL實戰窗口函數SQL分析班級學生考試成績及生活消費的詳細內容,更多關于SQL窗口函數分析成績及消費的資料請關注服務器之家其它相關文章!

原文鏈接:https://huang-tong-xue.blog.csdn.net/article/details/115908762

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 免费1级做55爰片l在线观看 | 999精品久久久 | 久久丝袜脚交足黄网站免费 | 国产一级毛片网站 | 在线视频成人永久免费 | 黄网站免费在线看 | 欧美成人午夜一区二区三区 | 亚洲一区二区三区在线免费观看 | 免费人成在线播放 | 精品国产99久久久久久宅男i | 免费福利在线视频 | 日韩黄在线| 国产成人在线视频 | 一区二区三区在线播放视频 | 久久精品国产99久久6动漫亮点 | 国产日韩在线观看一区 | 欧美一级特黄a | 久久人人爽人人爽人人片av高请 | 日日操夜夜透 | 国产精品视频海角社区88 | 欧美在线a | 高清av免费 | 毛片免费一区二区三区 | 免费网址黄 | 双性精h调教灌尿打屁股的文案 | 国产精品18久久久久久久 | 一级在线观看视频 | 在线a免费观看 | 国产日本在线播放 | 亚洲精品a级| 一区二区三区毛片 | 精品国产乱码久久久久久预案 | xxxx hd video 69| 欧美一级网 | 久久看视频 | 免费黄色大片在线观看 | 一区国产精品 | 日本一区二区不卡高清 | 亚洲视频黄 | 国产一区二区三区视频在线观看 | 亚洲电影在线观看高清免费 |