91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

SQL窗口函數之排名窗口函數怎么使用

發布時間:2022-09-09 10:34:22 來源:億速云 閱讀:162 作者:iii 欄目:數據庫

這篇文章主要介紹“SQL窗口函數之排名窗口函數怎么使用”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“SQL窗口函數之排名窗口函數怎么使用”文章能幫助大家解決問題。

取值窗口函數可以用于返回窗口內指定位置的數據行。常見的取值窗口函數如下:

LAG函數可以返回窗口內當前行之前的第N行數據。LEAD函數可以返回窗口內當前行之后的第N行數據。FIRST_VALUE函數可以返回窗口內第一行數據。LAST_VALUE函數可以返回窗口內最后一行數據。NTH_VALUE函數可以返回窗口內第N行數據。

其中,LAG函數和LEAD函數不支持動態的窗口大小,它們以整個分區作為分析的窗口。

案例分析

案例使用的示例表

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

以下是該表中的部分數據:

SQL窗口函數之排名窗口函數怎么使用

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

1.環比分析

環比增長指的是本期數據與上期數據相比的增長,例如,產品2019年6月的銷售額與2019年5月的銷售額相比增加的部分。

以下語句統計了各種產品每個月的環比增長率:

SELECT s.product AS "產品", 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 "環比增長率(%)"
FROM sales_monthly s
ORDER BY s.product,s.ym

其中,LAG(amount,1)表示獲取上一期的銷售額,PARTITION BY選項表示按照產品分區,ORDER BY選項表示按照月份進行排序。

當前月份的銷售額amount減去上一期的銷售額,再除以上一期的銷售額,就是環比增長率。

該查詢返回的結果如下:

SQL窗口函數之排名窗口函數怎么使用

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

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

2.同比分析

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

以下語句統計了各種產品每個月的同比增長率:

SELECT s.product AS "產品", 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)表示當前月份之前第12期的銷售額,也就是去年同月份的銷售額。

PARTITION BY選項表示按照產品分區,ORDER BY選項表示按照月份進行排序。

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

該查詢返回的結果如下:

SQL窗口函數之排名窗口函數怎么使用

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

提示:LEAD函數與LAG函數的使用方法類似,不過它的返回結果是當前行之后的第N行數據。

3.復合增長率

復合增長率是第N期的數據除以第一期的基準數據,然后開N-1次方再減去1得到的結果。

假如2018年的產品銷售額為10000,2019年的產品銷售額為12500,2020年的產品銷售額為15000。那么這兩年的復合增長率的計算方式如下:

SQL窗口函數之排名窗口函數怎么使用

以年度為單位計算的復合增長率被稱為年均復合增長率,以月度為單位計算的復合增長率被稱為月均復合增長率

以下查詢統計了自2018年1月以來不同產品的月均銷售額復合增長率:

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 "產品", ym AS "年月",amount AS "銷售額",
       (POWER( amount/first_amount, 1.0/NULLIF(num-1,0)) -1)*100 AS "月均復合增長率(%)"
FROM s
ORDER BY product, ym

首先定義了一個通用表表達式,其中FIRST_VALUE(amount)返回了第一期(201801)的銷售額,ROW_NUMBER函數返回了每一期的編號。

主查詢中的POWER函數用于執行開方運算,NULLIF函數用于處理第一期數據的除零錯誤,常量1.0用于避免由整數除法所導致的精度丟失問題。

該查詢返回的結果如下:

SQL窗口函數之排名窗口函數怎么使用

2018年1月是第一期,因此其產品月均銷售額復合增長率為空。

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

4.不同產品最高和最低銷售額

以下語句統計了不同產品最低銷售額、最高銷售額以及第三高銷售額所在的月份:

  SELECT product AS "產品", 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;

三個窗口函數的OVER子句相同,PARTITION BY選項表示按照產品進行分區,ORDER BY選項表示按照銷售額從高到低排序。

以上三個函數的默認窗口都是從分區的第一行到當前行,因此我們將窗口擴展到了整個分區。

該查詢返回的結果如下:

SQL窗口函數之排名窗口函數怎么使用

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

示例表和腳本

-- 創建銷量表sales_monthly
-- product表示產品名稱,ym表示年月,amount表示銷售金額(元)
CREATE TABLE sales_monthly(product VARCHAR(20), ym VARCHAR(10), amount NUMERIC(10, 2));
 
-- 生成測試數據
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);

關于“SQL窗口函數之排名窗口函數怎么使用”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

sql
AI

巴林左旗| 南和县| 临武县| 临城县| 乐业县| 汉川市| 建德市| 大竹县| 木兰县| 腾冲县| 泰州市| 黄冈市| 黄陵县| 榆林市| 刚察县| 化德县| 盱眙县| 凭祥市| 鹤山市| 天全县| 普宁市| 宁陕县| 广元市| 河西区| 乌苏市| 和田市| 澄迈县| 景宁| 大石桥市| 福建省| 且末县| 当阳市| 河北省| 长治县| 类乌齐县| 原阳县| 北宁市| 甘德县| 宣城市| 秀山| 会昌县|