国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

SQL助你面大廠(窗口函數(shù))

這篇具有很好參考價值的文章主要介紹了SQL助你面大廠(窗口函數(shù))。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

? ? ? ?在面試過程中窗口函數(shù)的應(yīng)用可謂是數(shù)不勝數(shù),前提你要知道什么是窗口函數(shù),最常用的窗口函數(shù)有哪些?語法是什么?分別用的場景是什么?今天會以這三個問題開始我們今天的學(xué)習(xí)

什么是窗口函數(shù)?

? ? ? ?所謂的窗口函數(shù)就是動態(tài)處理數(shù)據(jù)的一類函數(shù),也叫做“OLAP”函數(shù),可以對數(shù)據(jù)庫數(shù)據(jù)進行實時分析處理,“窗口函數(shù)”由兩部分組成:分析函數(shù)+窗口函數(shù)

--模板
函數(shù)名(字段名) over(partition by xxx,yyy order by zzz)

--詳細(xì)介紹
分析函數(shù) over (partition by "要分組的列")
              order by "要排序的列"
              rows between "開始的行" and "結(jié)束的行")

? ? ? ?over()部分才是“窗口函數(shù)”,只不過因為它的特點大家都這樣叫,其作用就是劃定窗口,分析函數(shù)的作用是在窗口內(nèi)對記錄進行統(tǒng)計

over函數(shù)中有3個參數(shù)

  • partition by

? ? ? ?其表示的是分區(qū)或者分組,可以理解成為group by,但是低位有所不同,如果partition by 和group by 后的字段相同,partition by 就會失效,因為group by先分組(劃分窗口),如果字段相同則partition by 就沒有可分的了

如果partition函數(shù)想要做到像group by一樣的效果,必須要和distinct關(guān)鍵字進行去重

  • order by

? ? ? ?表示排序,排序、累加都是有排序的操作在里面,根據(jù)設(shè)么條件排名、根據(jù)什么條件進行累加,order by后面可以跟一個字段也可以跟多個字段,位置優(yōu)先,越在前面排序的優(yōu)先級越高,默認(rèn)“asc(升序)” 小-大,desc(降序)大-小

  • rows between "開始的行" and "結(jié)束的行"

這部分是控制窗口大小的地方,一般默認(rèn)就行,也不會進行書寫,但是也可以自定義窗口大小:

proceding:往前
following:往后
unbounded:無窮盡的
current row:當(dāng)前行
unbounded proceding:往前所有行
unbounded following:往后所有行

?舉幾個例子方便理解:

rows between 2 preceding and current row         --取當(dāng)前行和前2行,這個可用于求移動平均 
rows between current row and 2 following         --取當(dāng)前行和后2行,這個可用于求移動平均
rows between unbounded preceding and current row --取當(dāng)前行和之前所有行,這個可用于求累加;如果沒有寫rows between參數(shù),則默認(rèn)的窗口就是這個范圍
rows between current row and unbounded following --取當(dāng)前行和之后所有行
rows between 2 preceding and 2 following         --取當(dāng)前行的前面2行和下面2行,總共5行,這個可用于求移動平均

動態(tài)窗口的動態(tài)演示圖:

SQL助你面大廠(窗口函數(shù)),SQL突擊,sql,數(shù)據(jù)庫

?接下來我們來講一般常用的三種窗口函數(shù):

我們現(xiàn)在有一個班級的成績數(shù)據(jù),要求按規(guī)定進行查詢:

CREATE TABLE class(
cid VARCHAR(10),
NAME VARCHAR(20),
grades INT
)
DROP TABLE class

INSERT INTO class (cid,NAME,grades) VALUES('1','路飛',60),('1','鳴人',70),('1','佐助',75),('1','蕭炎',80),('1','唐三',90),('1','奕星',91),('2','霸天虎',50),('2','玉環(huán)',60),('2','索隆',66),('2','墨子',85),('2','鐵甲小寶',89)

SQL助你面大廠(窗口函數(shù)),SQL突擊,sql,數(shù)據(jù)庫

? ? ? ?假如動漫學(xué)院期末成績出來了,老師讓你幫根據(jù)一定的規(guī)則去查詢成績,你可以幫忙完成這個工作么?

  • 聚合類的窗口函數(shù) sum() over()(舉例)? ? ? ?count\avg\max\min

情境一:現(xiàn)在要求讓每位同學(xué)后面都新增一列各自班級的總分

SELECT*,
  SUM(grades) OVER (PARTITION BY cid) AS "班級總分"
FROM class

SQL助你面大廠(窗口函數(shù)),SQL突擊,sql,數(shù)據(jù)庫

?情境二:計算同一個班級內(nèi),每個同學(xué)和比他分?jǐn)?shù)低的總分是多少?

SELECT*,
  SUM(grades) OVER (PARTITION BY cid ORDER BY grades) AS "累加分?jǐn)?shù)"
FROM class

SQL助你面大廠(窗口函數(shù)),SQL突擊,sql,數(shù)據(jù)庫

SELECT*,
  SUM(grades) OVER (PARTITION BY cid ORDER BY grades ROWS BETWEEN unbounded preceding AND current ROW ) AS "累加分?jǐn)?shù)"
FROM class

?這條SQL語句的效果和上面那條SQL語句效果一致,不寫的話默認(rèn)就是這個范圍

SQL助你面大廠(窗口函數(shù)),SQL突擊,sql,數(shù)據(jù)庫

  • 排序類的窗口函數(shù)

    SQL助你面大廠(窗口函數(shù)),SQL突擊,sql,數(shù)據(jù)庫

  1. row_number(順序,相同的不做特別處理)

    假如現(xiàn)在讓你將1、2班的成績排個名,從低到高,你有沒有什么好的辦法?|
    SELECT *,
      ROW_NUMBER() OVER (PARTITION BY cid ORDER BY grades DESC) AS "成績排名"
    FROM class;

    SQL助你面大廠(窗口函數(shù)),SQL突擊,sql,數(shù)據(jù)庫

  2. rank(相同的做特別處理,會進行占位)

    ? ? ? ?在拍完名之后,發(fā)現(xiàn)相同成績的同學(xué)居然排名不一樣,這又讓老師犯難了,怎么樣才能使得相同成績的同學(xué)擁有相同的排名
    SELECT *,
      RANK() OVER (PARTITION BY cid ORDER BY grades DESC) AS "成績排名"
    FROM class;

    SQL助你面大廠(窗口函數(shù)),SQL突擊,sql,數(shù)據(jù)庫

  3. dense_rank(相同的做特殊處理,不占位)

    ? ? ? ?但是又新出現(xiàn)了一個問題,相同的成績的排名確實排名也相同了,但是后面的那個同學(xué)居然是從3開始的,自動的將2跳過了,這也是我們不希望看到的
    ?
    SELECT *,
      DENSE_RANK() OVER (PARTITION BY cid ORDER BY grades DESC) AS "成績排名"
    FROM class;

    SQL助你面大廠(窗口函數(shù)),SQL突擊,sql,數(shù)據(jù)庫

  • 偏移類的、跨行的窗口函數(shù)
  1. lag(后面)

    如果現(xiàn)在又有一個任務(wù),讓每位同學(xué)知道比自己低1(N)名的同學(xué)的成績
    ?
    SELECT*,
    LAG(grades,1) OVER (PARTITION BY cid ORDER BY grades) AS "低一名的成績"
    FROM class

    SQL助你面大廠(窗口函數(shù)),SQL突擊,sql,數(shù)據(jù)庫

    但是最后的結(jié)果中卻出現(xiàn)了null值,我們想如果查不到數(shù)據(jù)結(jié)果置為0,該怎么去實現(xiàn)呢?
    LAG(字段,差值,默認(rèn)值)
    ?
    SELECT*,
    LAG(grades,1,0) OVER (PARTITION BY cid ORDER BY grades) AS "低一名的成績"
    FROM class

    SQL助你面大廠(窗口函數(shù)),SQL突擊,sql,數(shù)據(jù)庫

  2. 2.lead(前面)

?如果現(xiàn)在又有一個任務(wù),讓每位同學(xué)知道比自己高1(N)名的同學(xué)的成績


SELECT*,
LEAD(grades,1,0) OVER (PARTITION BY cid ORDER BY grades) AS "高一名的成績"
FROM class

SQL助你面大廠(窗口函數(shù)),SQL突擊,sql,數(shù)據(jù)庫

?最常用的窗口函數(shù)已經(jīng)介紹完了,學(xué)習(xí)SQL的路上一路有我?。?!文章來源地址http://www.zghlxwxcb.cn/news/detail-662367.html

到了這里,關(guān)于SQL助你面大廠(窗口函數(shù))的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 【SQL】MySQL中的窗口函數(shù)(開窗函數(shù))

    窗口函數(shù)是 MYSQL8.0 新增的 聚合函數(shù): 多行變一行,常見的sum,count,max,min 窗口函數(shù): 行數(shù)不變,常見的row_number,rank 語法格式: 窗口函數(shù)(表達(dá)式) over (partition by … order by … frame_clause) partition by是分區(qū),類似于group by,如去掉相當(dāng)于對所有數(shù)據(jù)進行計算 order by排序 frame_c

    2024年02月07日
    瀏覽(21)
  • SQL窗口分析函數(shù)使用詳解系列三之偏移量類窗口函數(shù)

    本文以HiveSQL語法進行代碼演示。 對于其他數(shù)據(jù)庫來說同樣也適用,比如SparkSQL,F(xiàn)linkSQL以及Mysql8,Oracle,SqlServer等傳統(tǒng)的關(guān)系型數(shù)據(jù)庫。 已更新第一類聚合函數(shù)類,點擊這里閱讀 ①SQL窗口函數(shù)系列一之聚合函數(shù)類 ②SQL窗口函數(shù)系列二之分組排序窗口函數(shù) 本節(jié)介紹Hive窗口分

    2024年04月26日
    瀏覽(23)
  • 【sql高級】postgresql之窗口函數(shù)用法

    【sql高級】postgresql之窗口函數(shù)用法

    窗口函數(shù)在在SQL中是非常有用的工具,特別是在需要對查詢結(jié)果進行分析、排名、聚合或者對結(jié)果進行一些特定的計算時。以下是一些常見的場景: 排名和分組:窗口函數(shù)可以輕松地對結(jié)果集進行排名、分組和分區(qū)。例如,你可以使用 ROW_NUMBER()、RANK()、DENSE_RANK() 等函數(shù)來為

    2024年03月23日
    瀏覽(41)
  • [SQL挖掘機] - 窗口函數(shù) - 計算移動平均

    在窗口函數(shù)使用時,計算的是累積到當(dāng)前行的所有的數(shù)據(jù)的相關(guān)操作。 實際上,還可以指定更加詳細(xì)的匯總范圍。該匯總范圍稱為 框架 (frame)。 其實這里也可以理解成一個 窗口 , 這個 窗口 是我們可以進行設(shè)置的. 之前我們介紹的窗口函數(shù)是根據(jù) partition by 進行分組, 然后根

    2024年02月14日
    瀏覽(27)
  • 【SQL篇】窗口函數(shù)和公共表達(dá)式

    【SQL篇】窗口函數(shù)和公共表達(dá)式

    思路 先給每個數(shù)進行排名 用這些數(shù)減去自己的排名,如果減了之后的結(jié)果是一樣的,說明這幾個數(shù)是連續(xù)的 用logid減去排名得出來的數(shù)進行g(shù)roup by,也就是把連續(xù)的數(shù)全都放在一個一個小組里面,求出每個小組的最大值和最小值就可以了 1596題 總結(jié) 這里有個坑,count并不會根

    2024年02月02日
    瀏覽(14)
  • 選讀SQL經(jīng)典實例筆記15_窗口函數(shù)

    選讀SQL經(jīng)典實例筆記15_窗口函數(shù)

    2.2.1.1.?分組不為空 2.2.1.1.1.?一個分組至少要擁有一個成員(行 2.2.1.1.2.?無法從一個空表中生成任何分組 2.2.1.2.?分組具有唯一性 2.2.1.2.1.?如果查詢語句使用了GROUP BY子句,那么通常而言SELECT列表里就不再需要使用DISTINCT了 2.2.2.1.?COUNT永遠(yuǎn)大于0 2.2.2.1.1.?無法從一個空表

    2024年02月14日
    瀏覽(15)
  • Spark_SQL函數(shù)定義(定義UDF函數(shù)、使用窗口函數(shù))

    Spark_SQL函數(shù)定義(定義UDF函數(shù)、使用窗口函數(shù))

    ????????????????? ??一、UDF函數(shù)定義 ? ? ? ? (1)函數(shù)定義 ? ? ? ? (2)Spark支持定義函數(shù) ? ? ? ? (3)定義UDF函數(shù) ? ? ? ? ? ? ? ? (4)定義返回Array類型的UDF ????????(5)定義返回字典類型的UDF 二、窗口函數(shù) ? ? ? ? (1)開窗函數(shù)簡述 ? ? ? ? (2)

    2024年02月03日
    瀏覽(19)
  • mysql 8.0 窗口函數(shù) 之 序號函數(shù) 與 sql server 序號函數(shù) 一樣

    mysql 8.0 窗口函數(shù) 之 序號函數(shù) 與 sql server 序號函數(shù) 一樣

    sql server 序號函數(shù) 序號函數(shù) ROW_NUMBER() 順序排序 RANK() 并列排序,會跳過重復(fù)的序號,比如序號為1,1,3 DENSE_RANK() 并列排序,不會跳過重復(fù)的序號,比如 序號為 1,1,2 語法結(jié)構(gòu) 窗口函數(shù)的優(yōu)點 使用窗口函數(shù),只用了一步就完成了查詢,而且,由于沒有用到臨時表,執(zhí)行的

    2024年02月11日
    瀏覽(25)
  • mysql 8.0 窗口函數(shù) 之 分布函數(shù) 與 sql server (2017以后支持) 分布函數(shù) 一樣

    mysql 8.0 窗口函數(shù) 之 分布函數(shù) 與 sql server (2017以后支持) 分布函數(shù) 一樣

    mysql 分布函數(shù) percent_rank() :等級值 百分比 cume_dist() :累積分布值 percent_rank() 計算方式 (rank-1)/(rows-1), 其中 rank 的值為使用RANK()函數(shù)產(chǎn)生的序號,rows 的值為當(dāng)前窗口的總記錄數(shù)。

    2024年02月11日
    瀏覽(28)
  • sql 分組討論,二級分組(非2個字段分組),使用 窗口函數(shù)和普通分組實現(xiàn)

    先按照一個字段分組,在按照 第二個字段分組。 之后,如果 這個 二級分組中的數(shù)據(jù),是 1條的。就篩選出來。 比如: 先按照 站點分組,再按照 設(shè)備分組, 即:如果站點上配置了2個設(shè)備。就篩選出來。 然后:這2個設(shè)備 都必須是屏幕 查出配置了2個設(shè)備的站點 要求 這兩個

    2024年02月13日
    瀏覽(16)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包