欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

MySQL實(shí)戰(zhàn)窗口函數(shù)SQL分析班級(jí)學(xué)生考試成績(jī)及生活消費(fèi)

 更新時(shí)間:2021年10月26日 09:21:36   作者:數(shù)據(jù)分析與統(tǒng)計(jì)學(xué)之美  
這篇文章主要為大家介紹了MySQL實(shí)戰(zhàn),利用窗口函數(shù)SQL來分析班級(jí)學(xué)生的考試成績(jī)及生活消費(fèi)的示例過程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步

一、背景介紹

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

在這里插入圖片描述

接著,在給大家公布一下各位同學(xué)的生活消費(fèi)情況。

在這里插入圖片描述

下面我們利用上述考試成績(jī)和生活消費(fèi)記錄,利用mysql做一個(gè)簡(jiǎn)單的分析。

當(dāng)然,從本文標(biāo)題就可以看出來。本文就是要結(jié)合這份數(shù)據(jù),為大家講述SQL “窗口函數(shù)” 應(yīng)該怎么用?

包括你以后學(xué)習(xí)hive或者oracle數(shù)據(jù)庫,或者說數(shù)據(jù)分析面試,這都將是一個(gè)很重要的知識(shí)點(diǎn)。

二、建表語句和插入數(shù)據(jù)

創(chuàng)建表格

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;

插入數(shù)據(jù)

insert into exam_score values
('張三' , 18, '語文' , 90),
('張三' , 18, '數(shù)學(xué)' , 80),
('張三' , 18, '英語' , 70),
('李四' , 21, '語文' , 88),
('李四' , 21, '數(shù)學(xué)' , 78),
('李四' , 21, '英語' , 71),
('王五' , 18, '語文' , 95),
('王五' , 18, '數(shù)學(xué)' , 83),
('王五' , 18, '英語' , 71),
('趙六' , 19, '語文' , 98),
('趙六' , 19, '數(shù)學(xué)' , 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);

三、窗口函數(shù)分類介紹

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

聚合函數(shù) + over()搭配;

排序函數(shù) + over()搭配;

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

偏移函數(shù) + over()搭配;

具體每一類,有哪些函數(shù)呢?觀察下面的思維導(dǎo)圖。

在這里插入圖片描述

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

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

order by + 字段:這個(gè)更容易理解,就是用于 “排序” 的關(guān)鍵字;

四、窗口函數(shù)應(yīng)用

上面給大家介紹了若干常用的 “窗口函數(shù)”,這里利用文首創(chuàng)建的數(shù)據(jù),講講 “窗口函數(shù)” 的應(yīng)用。

希望大家通過每個(gè)案例,來總結(jié)一下每個(gè)函數(shù)的含義,這里就不詳細(xì)寫了。

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

① 計(jì)算每位同學(xué)的得分與平均值的情況

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

結(jié)果如下:

在這里插入圖片描述

② 計(jì)算每位同學(xué)1-3月消費(fèi)情況和消費(fèi)總額

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

結(jié)果如下:

在這里插入圖片描述

③ 計(jì)算每位同學(xué)1-3月消費(fèi)情況和累計(jì)消費(fèi)總額

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

結(jié)果如下:

在這里插入圖片描述

注意: 結(jié)合②③,大家可以發(fā)現(xiàn)partition by結(jié)合order by,與不結(jié)合order by,得到的完全是不同的結(jié)果。一個(gè)是分組求總和(不加order by);一個(gè)是分組求累計(jì)和(加order by)。

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

① 計(jì)算每個(gè)科目的排名,相同的分?jǐn)?shù)排名不同,順序依次增加

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

結(jié)果如下:

在這里插入圖片描述

② 計(jì)算每個(gè)科目的排名,相同的分?jǐn)?shù)排名相同,余下排名跳躍增加

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

結(jié)果如下:

在這里插入圖片描述

③ 計(jì)算每個(gè)科目的排名,相同的分?jǐn)?shù)排名相同,余下排名順序增加

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

結(jié)果如下:

在這里插入圖片描述

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

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

① 對(duì)exam_score表,進(jìn)行整張表切分

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

結(jié)果如下:

在這里插入圖片描述

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

② 對(duì)exam_score表,按照subject分組切分

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

結(jié)果如下:

在這里插入圖片描述

即使是分組切分,你也會(huì)發(fā)現(xiàn),這樣毫無意義,因?yàn)閟core并沒有排序。

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

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

結(jié)果如下:

在這里插入圖片描述

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

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

① 展示各位同學(xué)的“上次購(gòu)買時(shí)間”和“下次購(gòu)買時(shí)間”

注:對(duì)于第一天,顯示 “first buy”;對(duì)于最后一天,顯示 “l(fā)ast buy;

select
	sname
	,buydate
    ,lag(buydate,1,'first day') over(partition by sname order by buydate) as 上次購(gòu)買時(shí)間
    ,lead(buydate,1,'last day') over(partition by sname order by buydate) as 下次購(gòu)買時(shí)間
from
	cost_fee

結(jié)果如下:

在這里插入圖片描述

② 截止到當(dāng)前日期,每位同學(xué)的“首次購(gòu)買時(shí)間”和“最后一次購(gòu)買時(shí)間”

select
	sname
	,buydate
    ,first_value(buydate) over(partition by sname order by buydate) as 首次購(gòu)買時(shí)間
    ,last_value(buydate) over(partition by sname order by buydate) as 最后一次購(gòu)買時(shí)間
from
	cost_fee

結(jié)果如下:

在這里插入圖片描述

③ 展示每位同學(xué)的“首次購(gòu)買時(shí)間”和“最后一次購(gòu)買時(shí)間”

注意: 這里并沒有說 “截止到當(dāng)前日期”,請(qǐng)注意②③之間的區(qū)別呀。需求不同,結(jié)果就不同。

select
	sname
	,buydate
    ,first_value(buydate) over(partition by sname order by buydate) as 首次購(gòu)買時(shí)間
    ,last_value(buydate) over(partition by sname ) as 最后一次購(gòu)買時(shí)間
from
	cost_fee

結(jié)果如下:

在這里插入圖片描述

以上就是MySQL實(shí)戰(zhàn)窗口函數(shù)SQL分析班級(jí)學(xué)生考試成績(jī)及生活消費(fèi)的詳細(xì)內(nèi)容,更多關(guān)于SQL窗口函數(shù)分析成績(jī)及消費(fèi)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • mysql 8.0.17 安裝圖文教程

    mysql 8.0.17 安裝圖文教程

    這篇文章主要為大家詳細(xì)介紹了mysql 8.0.17 安裝配置方法圖文教程,文中安裝步驟介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • mysql 5.1版本修改密碼及遠(yuǎn)程登錄mysql數(shù)據(jù)庫的方法

    mysql 5.1版本修改密碼及遠(yuǎn)程登錄mysql數(shù)據(jù)庫的方法

    這篇文章主要介紹了mysql 5.1版本修改密碼及遠(yuǎn)程登錄mysql數(shù)據(jù)庫的方法,需要的朋友可以參考下
    2017-04-04
  • 如何利用insert?into?values插入多條數(shù)據(jù)

    如何利用insert?into?values插入多條數(shù)據(jù)

    這篇文章主要介紹了如何利用insert?into?values插入多條數(shù)據(jù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • Canal監(jiān)聽MySQL的實(shí)現(xiàn)步驟

    Canal監(jiān)聽MySQL的實(shí)現(xiàn)步驟

    本文主要介紹了Canal監(jiān)聽MySQL的實(shí)現(xiàn)步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • MySQL聯(lián)合索引用法示例

    MySQL聯(lián)合索引用法示例

    這篇文章主要介紹了MySQL聯(lián)合索引用法,結(jié)合實(shí)例形式分析了MySQL聯(lián)合索引的具體定義與使用方法,需要的朋友可以參考下
    2016-09-09
  • MySQL數(shù)據(jù)庫觸發(fā)器從小白到精通

    MySQL數(shù)據(jù)庫觸發(fā)器從小白到精通

    觸發(fā)器是SQLserver提供給程序員和數(shù)據(jù)分析員來保證數(shù)據(jù)完整性的一種方法,它是與表事件相關(guān)的特殊的存儲(chǔ)過程,它的執(zhí)行不是由程序調(diào)用,也不是手工啟動(dòng),而是由事件來觸發(fā),比如當(dāng)對(duì)一個(gè)表進(jìn)行操作時(shí)就會(huì)激活它執(zhí)行。觸發(fā)器經(jīng)常用于加強(qiáng)數(shù)據(jù)的完整性約束和業(yè)務(wù)規(guī)則等
    2022-03-03
  • mysql 5.7 docker 主從復(fù)制架構(gòu)搭建教程

    mysql 5.7 docker 主從復(fù)制架構(gòu)搭建教程

    這篇文章主要為大家詳細(xì)介紹了mysql 5.7 docker 主從復(fù)制架構(gòu)搭建教程,感興趣的小伙伴們可以參考一下
    2016-07-07
  • MySQL系列之四 SQL語法

    MySQL系列之四 SQL語法

    SQL是一種特殊目的的編程語言,是一種數(shù)據(jù)庫查詢和程序設(shè)計(jì)語言,用于存取數(shù)據(jù)以及查詢、更新和管理關(guān)系數(shù)據(jù)庫系統(tǒng),這篇文章主要給大家介紹了SQL語法的相關(guān)資料,需要的朋友可以參考下
    2021-07-07
  • mysql使用SQLyog導(dǎo)入csv數(shù)據(jù)不成功的解決方法

    mysql使用SQLyog導(dǎo)入csv數(shù)據(jù)不成功的解決方法

    給mysql導(dǎo)入數(shù)據(jù),選中某個(gè)表選擇導(dǎo)入--導(dǎo)入使用本地csv數(shù)據(jù)即可,單有的時(shí)候不知道什么問題導(dǎo)入不成功
    2014-07-07
  • MySQL數(shù)據(jù)庫遠(yuǎn)程訪問權(quán)限設(shè)置方式

    MySQL數(shù)據(jù)庫遠(yuǎn)程訪問權(quán)限設(shè)置方式

    這篇文章主要介紹了MySQL數(shù)據(jù)庫遠(yuǎn)程訪問權(quán)限設(shè)置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-04-04

最新評(píng)論