最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SQL窗口函數(shù)之排名窗口函數(shù)的使用

 更新時(shí)間:2022年04月21日 10:07:48   作者:梁萌  
取值窗口函數(shù)可以用于返回窗口內(nèi)指定位置的數(shù)據(jù)行。本文主要介紹了SQL窗口函數(shù)之排名窗口函數(shù)的使用,具有一定的參考價(jià)值,感興趣的可以了解一下

關(guān)于窗口函數(shù)的基礎(chǔ),請(qǐng)看文章SQL窗口函數(shù)

取值窗口函數(shù)可以用于返回窗口內(nèi)指定位置的數(shù)據(jù)行。常見的取值窗口函數(shù)如下:

LAG函數(shù)可以返回窗口內(nèi)當(dāng)前行之前的第N行數(shù)據(jù)。LEAD函數(shù)可以返回窗口內(nèi)當(dāng)前行之后的第N行數(shù)據(jù)。FIRST_VALUE函數(shù)可以返回窗口內(nèi)第一行數(shù)據(jù)。LAST_VALUE函數(shù)可以返回窗口內(nèi)最后一行數(shù)據(jù)。NTH_VALUE函數(shù)可以返回窗口內(nèi)第N行數(shù)據(jù)。

其中,LAG函數(shù)和LEAD函數(shù)不支持動(dòng)態(tài)的窗口大小,它們以整個(gè)分區(qū)作為分析的窗口。

案例分析

案例使用的示例表

下面的查詢中會(huì)用到一張表,sales_monthly表中存儲(chǔ)了商品銷量信息,product表示產(chǎn)品名稱,ym表示年月,amount表示銷售金額(元)。

以下是該表中的部分?jǐn)?shù)據(jù):

這個(gè)表的初始化腳本可以在文章底部獲取。

1.環(huán)比分析

環(huán)比增長指的是本期數(shù)據(jù)與上期數(shù)據(jù)相比的增長,例如,產(chǎn)品2019年6月的銷售額與2019年5月的銷售額相比增加的部分。

以下語句統(tǒng)計(jì)了各種產(chǎn)品每個(gè)月的環(huán)比增長率:

SELECT s.product AS "產(chǎn)品", s.ym AS "年月", s.amount AS "銷售額",
 ( 
    (s.amount - LAG(s.amount,1) OVER (PARTITION BY product ORDER BY s.ym))/
    LAG(s.amount,1) OVER (PARTITION BY product ORDER BY s.ym)
 ) * 100 AS "環(huán)比增長率(%)"
FROM sales_monthly s
ORDER BY s.product,s.ym

其中,LAG(amount,1)表示獲取上一期的銷售額,PARTITION BY選項(xiàng)表示按照產(chǎn)品分區(qū),ORDER BY選項(xiàng)表示按照月份進(jìn)行排序。

當(dāng)前月份的銷售額amount減去上一期的銷售額,再除以上一期的銷售額,就是環(huán)比增長率。

該查詢返回的結(jié)果如下: 

2018年1月是第一期,因此其環(huán)比增長率為空。

“桔子”2018年2月的環(huán)比增長率約為0.2856%((10183-10154)/10154×100),依此類推。

2.同比分析

同比增長指的是本期數(shù)據(jù)與上一年度或歷史同期相比的增長,例如,產(chǎn)品2019年6月的銷售額與2018年6月的銷售額相比增加的部分。

以下語句統(tǒng)計(jì)了各種產(chǎn)品每個(gè)月的同比增長率:

SELECT s.product AS "產(chǎn)品", s.ym AS "年月", s.amount AS "銷售額",
 ( 
    (s.amount - LAG(s.amount,12) OVER (PARTITION BY product ORDER BY s.ym))/
    LAG(s.amount,12) OVER (PARTITION BY product ORDER BY s.ym)
 ) * 100 AS "同比增長率(%)"
FROM sales_monthly s
ORDER BY s.product,s.ym

其中,LAG(amount,12)表示當(dāng)前月份之前第12期的銷售額,也就是去年同月份的銷售額。

PARTITION BY選項(xiàng)表示按照產(chǎn)品分區(qū),ORDER BY選項(xiàng)表示按照月份進(jìn)行排序。

當(dāng)前月份的銷售額amount減去去年同期的銷售額,再除以去年同期的銷售額,就是同比增長率。

該查詢返回的結(jié)果如下:

2018年的12期數(shù)據(jù)都沒有對(duì)應(yīng)的同比增長率,“桔子”2019年1月的同比增長率約為9.3067%((11099-10154)/10154×100),依此類推。

提示:LEAD函數(shù)與LAG函數(shù)的使用方法類似,不過它的返回結(jié)果是當(dāng)前行之后的第N行數(shù)據(jù)。

3.復(fù)合增長率

復(fù)合增長率是第N期的數(shù)據(jù)除以第一期的基準(zhǔn)數(shù)據(jù),然后開N-1次方再減去1得到的結(jié)果。

假如2018年的產(chǎn)品銷售額為10000,2019年的產(chǎn)品銷售額為12500,2020年的產(chǎn)品銷售額為15000。那么這兩年的復(fù)合增長率的計(jì)算方式如下:

以年度為單位計(jì)算的復(fù)合增長率被稱為年均復(fù)合增長率,以月度為單位計(jì)算的復(fù)合增長率被稱為月均復(fù)合增長率。

以下查詢統(tǒng)計(jì)了自2018年1月以來不同產(chǎn)品的月均銷售額復(fù)合增長率:

WITH s (product,ym,amount,first_amount,num) AS (
  SELECT m.product, m.ym, m.amount,
  FIRST_VALUE(m.amount) OVER (PARTITION BY m.product ORDER BY m.ym),
  ROW_NUMBER() OVER (PARTITION BY m.product ORDER BY m.ym)
  FROM sales_monthly m
)
 
SELECT product AS "產(chǎn)品", ym AS "年月",amount AS "銷售額",
       (POWER( amount/first_amount, 1.0/NULLIF(num-1,0)) -1)*100 AS "月均復(fù)合增長率(%)"
FROM s
ORDER BY product, ym

首先定義了一個(gè)通用表表達(dá)式,其中FIRST_VALUE(amount)返回了第一期(201801)的銷售額,ROW_NUMBER函數(shù)返回了每一期的編號(hào)。

主查詢中的POWER函數(shù)用于執(zhí)行開方運(yùn)算,NULLIF函數(shù)用于處理第一期數(shù)據(jù)的除零錯(cuò)誤,常量1.0用于避免由整數(shù)除法所導(dǎo)致的精度丟失問題。

該查詢返回的結(jié)果如下:

2018年1月是第一期,因此其產(chǎn)品月均銷售額復(fù)合增長率為空。

“桔子”2018年2月的月均銷售額復(fù)合增長率等于它的環(huán)比增長率,2018年3月的月均銷售額復(fù)合增長率等于0.4471%,依此類推。 

4.不同產(chǎn)品最高和最低銷售額

以下語句統(tǒng)計(jì)了不同產(chǎn)品最低銷售額、最高銷售額以及第三高銷售額所在的月份:

  SELECT product AS "產(chǎn)品", ym AS "年月",amount AS "銷售額",
  
         FIRST_VALUE(m.ym) OVER (
           PARTITION BY m.product ORDER BY m.amount DESC
           ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
         ) AS "最高銷售額月份",
         
         LAST_VALUE(m.ym) OVER (
           PARTITION BY m.product ORDER BY m.amount DESC
           ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
         ) AS "最低銷售額月份",
         
         NTH_VALUE(m.ym,3) OVER (
           PARTITION BY m.product ORDER BY m.amount DESC
           ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
         ) AS "第三高銷售額月份"
 
  FROM sales_monthly m
  ORDER BY product, ym;

三個(gè)窗口函數(shù)的OVER子句相同,PARTITION BY選項(xiàng)表示按照產(chǎn)品進(jìn)行分區(qū),ORDER BY選項(xiàng)表示按照銷售額從高到低排序。

以上三個(gè)函數(shù)的默認(rèn)窗口都是從分區(qū)的第一行到當(dāng)前行,因此我們將窗口擴(kuò)展到了整個(gè)分區(qū)。

該查詢返回的結(jié)果如下: 

“桔子”的最高銷售額出現(xiàn)在2019年6月,最低銷售額出現(xiàn)在2018年1月,第三高銷售額出現(xiàn)在2019年4月。

示例表和腳本

-- 創(chuàng)建銷量表sales_monthly
-- product表示產(chǎn)品名稱,ym表示年月,amount表示銷售金額(元)
CREATE TABLE sales_monthly(product VARCHAR(20), ym VARCHAR(10), amount NUMERIC(10, 2));
 
-- 生成測試數(shù)據(jù)
INSERT INTO sales_monthly (product,ym,amount) VALUES ('蘋果','201801',10159.00);
INSERT INTO sales_monthly (product,ym,amount) VALUES ('蘋果','201802',10211.00);
INSERT INTO sales_monthly (product,ym,amount) VALUES ('蘋果','201803',10247.00);
INSERT INTO sales_monthly (product,ym,amount) VALUES ('蘋果','201804',10376.00);
INSERT INTO sales_monthly (product,ym,amount) VALUES ('蘋果','201805',10400.00);
INSERT INTO sales_monthly (product,ym,amount) VALUES ('蘋果','201806',10565.00);
INSERT INTO sales_monthly (product,ym,amount) VALUES ('蘋果','201807',10613.00);
INSERT INTO sales_monthly (product,ym,amount) VALUES ('蘋果','201808',10696.00);
INSERT INTO sales_monthly (product,ym,amount) VALUES ('蘋果','201809',10751.00);
INSERT INTO sales_monthly (product,ym,amount) VALUES ('蘋果','201810',10842.00);
INSERT INTO sales_monthly (product,ym,amount) VALUES ('蘋果','201811',10900.00);
INSERT INTO sales_monthly (product,ym,amount) VALUES ('蘋果','201812',10972.00);
INSERT INTO sales_monthly (product,ym,amount) VALUES ('蘋果','201901',11155.00);
INSERT INTO sales_monthly (product,ym,amount) VALUES ('蘋果','201902',11202.00);
INSERT INTO sales_monthly (product,ym,amount) VALUES ('蘋果','201903',11260.00);
INSERT INTO sales_monthly (product,ym,amount) VALUES ('蘋果','201904',11341.00);
INSERT INTO sales_monthly (product,ym,amount) VALUES ('蘋果','201905',11459.00);
INSERT INTO sales_monthly (product,ym,amount) VALUES ('蘋果','201906',11560.00);
INSERT INTO sales_monthly (product,ym,amount) VALUES ('香蕉','201801',10138.00);
INSERT INTO sales_monthly (product,ym,amount) VALUES ('香蕉','201802',10194.00);
INSERT INTO sales_monthly (product,ym,amount) VALUES ('香蕉','201803',10328.00);
INSERT INTO sales_monthly (product,ym,amount) VALUES ('香蕉','201804',10322.00);
INSERT INTO sales_monthly (product,ym,amount) VALUES ('香蕉','201805',10481.00);
INSERT INTO sales_monthly (product,ym,amount) VALUES ('香蕉','201806',10502.00);
INSERT INTO sales_monthly (product,ym,amount) VALUES ('香蕉','201807',10589.00);
INSERT INTO sales_monthly (product,ym,amount) VALUES ('香蕉','201808',10681.00);
INSERT INTO sales_monthly (product,ym,amount) VALUES ('香蕉','201809',10798.00);
INSERT INTO sales_monthly (product,ym,amount) VALUES ('香蕉','201810',10829.00);
INSERT INTO sales_monthly (product,ym,amount) VALUES ('香蕉','201811',10913.00);
INSERT INTO sales_monthly (product,ym,amount) VALUES ('香蕉','201812',11056.00);
INSERT INTO sales_monthly (product,ym,amount) VALUES ('香蕉','201901',11161.00);
INSERT INTO sales_monthly (product,ym,amount) VALUES ('香蕉','201902',11173.00);
INSERT INTO sales_monthly (product,ym,amount) VALUES ('香蕉','201903',11288.00);
INSERT INTO sales_monthly (product,ym,amount) VALUES ('香蕉','201904',11408.00);
INSERT INTO sales_monthly (product,ym,amount) VALUES ('香蕉','201905',11469.00);
INSERT INTO sales_monthly (product,ym,amount) VALUES ('香蕉','201906',11528.00);
INSERT INTO sales_monthly (product,ym,amount) VALUES ('桔子','201801',10154.00);
INSERT INTO sales_monthly (product,ym,amount) VALUES ('桔子','201802',10183.00);
INSERT INTO sales_monthly (product,ym,amount) VALUES ('桔子','201803',10245.00);
INSERT INTO sales_monthly (product,ym,amount) VALUES ('桔子','201804',10325.00);
INSERT INTO sales_monthly (product,ym,amount) VALUES ('桔子','201805',10465.00);
INSERT INTO sales_monthly (product,ym,amount) VALUES ('桔子','201806',10505.00);
INSERT INTO sales_monthly (product,ym,amount) VALUES ('桔子','201807',10578.00);
INSERT INTO sales_monthly (product,ym,amount) VALUES ('桔子','201808',10680.00);
INSERT INTO sales_monthly (product,ym,amount) VALUES ('桔子','201809',10788.00);
INSERT INTO sales_monthly (product,ym,amount) VALUES ('桔子','201810',10838.00);
INSERT INTO sales_monthly (product,ym,amount) VALUES ('桔子','201811',10942.00);
INSERT INTO sales_monthly (product,ym,amount) VALUES ('桔子','201812',10988.00);
INSERT INTO sales_monthly (product,ym,amount) VALUES ('桔子','201901',11099.00);
INSERT INTO sales_monthly (product,ym,amount) VALUES ('桔子','201902',11181.00);
INSERT INTO sales_monthly (product,ym,amount) VALUES ('桔子','201903',11302.00);
INSERT INTO sales_monthly (product,ym,amount) VALUES ('桔子','201904',11327.00);
INSERT INTO sales_monthly (product,ym,amount) VALUES ('桔子','201905',11423.00);
INSERT INTO sales_monthly (product,ym,amount) VALUES ('桔子','201906',11524.00);

到此這篇關(guān)于SQL窗口函數(shù)之排名窗口函數(shù)的使用的文章就介紹到這了,更多相關(guān)SQL 排名窗口函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 將sqlserver數(shù)據(jù)遷移到mysql的詳細(xì)步驟記錄

    將sqlserver數(shù)據(jù)遷移到mysql的詳細(xì)步驟記錄

    這篇文章主要介紹了將SQL?Server數(shù)據(jù)遷移到MySQL的步驟,包括導(dǎo)出數(shù)據(jù)、轉(zhuǎn)換數(shù)據(jù)格式和導(dǎo)入數(shù)據(jù),通過示例和工具說明,幫助大家順利完成遷移任務(wù),需要的朋友可以參考下
    2025-01-01
  • SQL?Server解析/操作Json格式字段數(shù)據(jù)的方法實(shí)例

    SQL?Server解析/操作Json格式字段數(shù)據(jù)的方法實(shí)例

    SQL SERVER沒有自帶的解析json函數(shù),需要自建一個(gè)函數(shù)(表值函數(shù)),下面這篇文章主要給大家介紹了關(guān)于SQL?Server解析/操作Json格式字段數(shù)據(jù)的相關(guān)資料,需要的朋友可以參考下
    2022-08-08
  • SQLSERVER 時(shí)間格式大全

    SQLSERVER 時(shí)間格式大全

    最近在寫程序的過程中有遇到SQL SERVER時(shí)間格式的問題,一時(shí)想不起來,上網(wǎng)搜索了一下,這方面的資料還真不少,找了一個(gè)比較全面的。
    2010-05-05
  • 使用BULK INSERT大批量導(dǎo)入數(shù)據(jù) SQLSERVER

    使用BULK INSERT大批量導(dǎo)入數(shù)據(jù) SQLSERVER

    使用BULK INSERT大批量導(dǎo)入數(shù)據(jù) SQLSERVER,需要的朋友可以參考下。
    2011-12-12
  • SQL Server查詢執(zhí)行過的SQL記錄的方法

    SQL Server查詢執(zhí)行過的SQL記錄的方法

    這篇文章給大家介紹了SQL Server查詢執(zhí)行過的SQL記錄的方法,文中通過代碼示例給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-01-01
  • SQL Server的基本功能性語句介紹

    SQL Server的基本功能性語句介紹

    本篇文章介紹了,SQL Server的基本功能性語句。需要的朋友參考下
    2013-04-04
  • SQL Server2022安裝教程的實(shí)現(xiàn)步驟(圖文教程)

    SQL Server2022安裝教程的實(shí)現(xiàn)步驟(圖文教程)

    在日常的工作中,sql server作為一款常用的數(shù)據(jù)庫管理系統(tǒng),安裝與配置就顯得非常重要,本文主要介紹了SQL Server2022安裝教程的實(shí)現(xiàn)步驟,感興趣的可以了解一下
    2023-09-09
  • SQL查詢中出現(xiàn)笛卡爾積現(xiàn)象的解決方法

    SQL查詢中出現(xiàn)笛卡爾積現(xiàn)象的解決方法

    本文主要介紹了SQL查詢中出現(xiàn)笛卡爾積現(xiàn)象的解決方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • SQL?Server語句日期格式查找的方法示例詳解

    SQL?Server語句日期格式查找的方法示例詳解

    在SQL?Server中,處理日期格式和查找特定日期格式的記錄是一個(gè)常見的需求,SQL?Server提供了多種函數(shù)和格式選項(xiàng)來處理和比較日期,以下是一個(gè)詳細(xì)的示例,展示了如何根據(jù)特定日期格式查找記錄,需要的朋友可以參考下
    2024-09-09
  • 解決在SQL腳本中的注釋引起的奇怪問題

    解決在SQL腳本中的注釋引起的奇怪問題

    通過osql.exe這個(gè)工具來對(duì)相關(guān)的數(shù)據(jù)庫腳本進(jìn)行更新,昨天突然發(fā)現(xiàn)安裝包報(bào)錯(cuò)了,說腳本錯(cuò)誤,研究發(fā)現(xiàn)有個(gè)不錯(cuò)的解決方法,需要的朋友不要錯(cuò)過
    2013-11-11

最新評(píng)論

晋城| 密云县| 磐安县| 神木县| 大同县| 钟祥市| 扶沟县| 泗水县| 汝城县| 漠河县| 乌苏市| 靖西县| 安图县| 民勤县| 安阳县| 杭锦后旗| 秦皇岛市| 栾城县| 南宫市| 邯郸市| 墨玉县| 万宁市| 涟源市| 安丘市| 卢湾区| 霍林郭勒市| 郁南县| 于都县| 包头市| 绿春县| 文登市| 邢台县| 邛崃市| 淳安县| 榆林市| 明水县| 奎屯市| 冷水江市| 肇源县| 金寨县| 南充市|