T天池SQL訓練營(五)-窗口函數等

–天池龍珠計劃SQL訓練營

5.1窗口函數

5.1.1窗口函數概念及基本的使用方法

窗口函數也稱為OLAP函數。OLAP 是OnLine AnalyticalProcessing 的簡稱,意思是對數據庫數據進行實時分析處理。
為了便于理解,稱之為窗口函數。常規的SELECT語句都是對整張表進行查詢,而窗口函數可以讓我們有選擇的去某一部分數據進行匯總、計算和排序。
窗口函數的通用形式:

<窗口函數> OVER ([PARTITION BY <列名>]ORDER BY <排序用列名>)

[]中的內容可以省略。
窗口函數最關鍵的是搞明白關鍵字****PARTITON BY
ORDER BY*****的作用。
PARTITON BY是用來分組,即選擇要看哪個窗口,類似于GROUP BY 子句的分組功能,但是PARTITION BY 子句并不具備GROUP BY 子句的匯總功能,并不會改變原始表中記錄的行數。
ORDER BY是用來排序,即決定窗口內,是按那種規則(字段)來排序的。
舉個栗子:

SELECT product_name,product_type,sale_price,RANK() OVER (PARTITION BY product_typeORDER BY sale_price) AS rankingFROM product

得到的結果是:
image.png
我們先忽略生成的新列 - [ranking], 看下原始數據在PARTITION BY 和 ORDER BY 關鍵字的作用下發生了什么變化。
PARTITION BY 能夠設定窗口對象范圍。本例中,為了按照商品種類進行排序,我們指定了product_type。即一個商品種類就是一個小的"窗口"。
ORDER BY 能夠指定按照哪一列、何種順序進行排序。為了按照銷售單價的升序進行排列,我們指定了sale_price。此外,窗口函數中的ORDER BY與SELECT語句末尾的ORDER BY一樣,可以通過關鍵字ASC/DESC來指定升序/降序。省略該關鍵字時會默認按照ASC,也就是
升序進行排序。本例中就省略了上述關鍵字 。
image.png

5.2窗口函數種類

大致來說,窗口函數可以分為兩類。
一是 將SUM、MAX、MIN等聚合函數用在窗口函數中
二是 RANK、DENSE_RANK等排序用的專用窗口函數

5.2.1專用窗口函數

  • **RANK函數 **(英式排序)

計算排序時,如果存在相同位次的記錄,則會跳過之后的位次。
例)有 3 條記錄排在第 1 位時:1 位、1 位、1 位、4 位……

  • DENSE_RANK函數**(中式排序)**

同樣是計算排序,即使存在相同位次的記錄,也不會跳過之后的位次。
例)有 3 條記錄排在第 1 位時:1 位、1 位、1 位、2 位……

  • ROW_NUMBER函數

賦予唯一的連續位次。
例)有 3 條記錄排在第 1 位時:1 位、2 位、3 位、4 位
運行以下代碼:

SELECT  product_name,product_type,sale_price,RANK() OVER (ORDER BY sale_price) AS ranking,DENSE_RANK() OVER (ORDER BY sale_price) AS dense_ranking,ROW_NUMBER() OVER (ORDER BY sale_price) AS row_numFROM product

image.png

5.2.2聚合函數在窗口函數上的使用

聚合函數在開窗函數中的使用方法和之前的專用窗口函數一樣,只是出來的結果是一個累計的聚合函數值。
運行以下代碼:

SELECT  product_id,product_name,sale_price,SUM(sale_price) OVER (ORDER BY product_id) AS current_sum,AVG(sale_price) OVER (ORDER BY product_id) AS current_avg  FROM product;

image.png
image.png
可以看出,聚合函數結果是,按我們指定的排序,這里是product_id,當前所在行及之前所有的行的合計或均值。即累計到當前行的聚合。

5.3窗口函數的的應用 - 計算移動平均

在上面提到,聚合函數在窗口函數使用時,計算的是累積到當前行的所有的數據的聚合。 實際上,還可以指定更加詳細的匯總范圍。該匯總范圍成為框架(frame)。
語法

<窗口函數> OVER (ORDER BY <排序用列名>ROWS n PRECEDING )  <窗口函數> OVER (ORDER BY <排序用列名>ROWS BETWEEN n PRECEDING AND n FOLLOWING)

PRECEDING(“之前”), 將框架指定為 “截止到之前 n 行”,加上自身行
FOLLOWING(“之后”), 將框架指定為 “截止到之后 n 行”,加上自身行
BETWEEN 1 PRECEDING AND 1 FOLLOWING,將框架指定為 “之前1行” + “之后1行” + “自身”
執行以下代碼:

SELECT  product_id,product_name,sale_price,AVG(sale_price) OVER (ORDER BY product_idROWS 2 PRECEDING) AS moving_avg,AVG(sale_price) OVER (ORDER BY product_idROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) AS moving_avg  FROM product

執行結果:
注意觀察框架的范圍。
ROWS 2 PRECEDING:
image.png
ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING:
image.png

5.3.1窗口函數適用范圍和注意事項

  • 原則上,窗口函數只能在SELECT子句中使用。
  • 窗口函數OVER 中的ORDER BY 子句并不會影響最終結果的排序。其只是用來決定窗口函數按何種順序計算。

5.4GROUPING運算符

5.4.1ROLLUP - 計算合計及小計

常規的GROUP BY 只能得到每個分類的小計,有時候還需要計算分類的合計,可以用 ROLLUP關鍵字。

SELECT  product_type,regist_date,SUM(sale_price) AS sum_priceFROM productGROUP BY product_type, regist_date WITH ROLLUP

得到的結果為:
image.png
image.png
這里ROLLUP 對product_type, regist_date兩列進行合計匯總。結果實際上有三層聚合,如下圖 模塊3是常規的 GROUP BY 的結果,需要注意的是衣服 有個注冊日期為空的,這是本來數據就存在日期為空的,不是對衣服類別的合計; 模塊2和1是 ROLLUP 帶來的合計,模塊2是對產品種類的合計,模塊1是對全部數據的總計。
ROLLUP 可以對多列進行匯總求小計和合計。
image.png

練習題

5.1

請說出針對本章中使用的product(商品)表執行如下 SELECT 語句所能得到的結果。

SELECT  product_id,product_name,sale_price,MAX(sale_price) OVER (ORDER BY product_id) AS Current_max_priceFROM product

** 答:按照 product_id 升序排列,計算出截?當前?的最? sale_price 。 **

5.2

繼續使用product表,計算出按照登記日期(regist_date)升序進行排列的各日期的銷售單價(sale_price)的總額。排序是需要將登記日期為NULL 的“運動 T 恤”記錄排在第 1 位(也就是將其看作比其他日期都早)

-- ①regist_date為NULL時,顯示“1年1?1?”。
SELECT regist_date, product_name, sale_price,SUM(sale_price) OVER (ORDER BY COALESCE(regist_date, CAST('0001-01-01'
AS DATE))) AS current_sum_priceFROM Product;-- ②regist_date為NULL時,將該記錄放在最前顯示。
SELECT regist_date, product_name, sale_price,SUM(sale_price) OVER (ORDER BY regist_date NULLS FIRST) AS
current_sum_priceFROM Product;

5.3

思考題
① 窗口函數不指定PARTITION BY的效果是什么?
答: 窗?函數不指定 PARTITION BY 就是針對排序列進?全局排序
② 為什么說窗口函數只能在SELECT子句中使用?實際上,在ORDER BY 子句使用系統并不會報錯。

答: 本質上是因為 SQL 語句的執?順序。 FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY 如果在 WHERE, GROUP BY, HAVING 使?了窗?函數,就是說提前進?了?次排序,排序之后再去除 記錄、匯總、匯總過濾,第?次排序結果就是錯誤的,沒有實際意義。? ORDER BY 語句執?順序在 SELECT 語句之后,?然是可以使?的。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/211250.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/211250.shtml
英文地址,請注明出處:http://en.pswp.cn/news/211250.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Unity由“鼠標點不準物體”引發的Camera的相關思考

問題 前段一個同事在使用Unity開發時遇到一個奇怪的問題&#xff0c;使用左鍵點擊發射射線的方式選擇物體&#xff0c;總是選不準&#xff0c;尤其是小的物體&#xff0c;鼠標點擊到物體上&#xff0c;有時能選上&#xff0c;有時選不上&#xff0c;偶爾點擊到物體旁邊…

Tensorflow.js 入門學習指南

Tensorflow.js 入門學習指南 官方地址TensorFlow.js (google.cn) Tensorflowjs是一個機器學習框架&#xff0c;使用 TensorFlowJS 可以創建生產級機器學習模型 安裝包 瀏覽器設置 您可以通過兩種主要方式在瀏覽器項目中獲取 TensorFlow.js&#xff1a; 使用腳本代碼。從 NPM…

基于MATLAB車輛防碰撞系統仿真

摘要 近年來&#xff0c;汽車行業的飛速發展使得我國的汽車保有量快速增長&#xff0c;但由此引發的交通事故導致的人員傷亡數量仍居高不下。從保護人身安全和降低交通事故發生的可能性的角度出發&#xff0c;車輛防碰撞系統能夠使駕駛員在沒注意到與前方車輛有碰撞危險的情況下…

Python:核心知識點整理大全11-筆記

目錄 ?編輯 6.2.4 修改字典中的值 6.2.5 刪除鍵—值對 注意 刪除的鍵—值對永遠消失了。 6.2.6 由類似對象組成的字典 6.3 遍歷字典 6.3.1 遍歷所有的鍵—值對 6.3.2 遍歷字典中的所有鍵 往期快速傳送門&#x1f446;&#xff08;在文章最后&#xff09;&#xff1a; 6.…

風力發電對講 IP語音對講終端IP安防一鍵呼叫對講 醫院對講終端SV-6005網絡音頻終端

風力發電對講 IP語音對講終端IP安防一鍵呼叫對講 醫院對講終端SV-6005網絡音頻終端 目 錄 1、產品規格 2、接口使用 2.1、側面接口功能 2.2、背面接口功能 2.3、面板接口功能 3、功能使用 1、產品規格 輸入電源&#xff1a; 12V&#xff5e;24V的直流電源 網絡接口&am…

前端知識庫Html5和CSS3

1、常見的水平垂直居中實現方案 最簡單的方案是flex布局 .container{display: flex;align-items: center;justify-content: center; }絕對定位配合margin:auto(一定要給.son寬高) .father {position: relative;height: 300px; } .son {position: absolute;top: 0;right: 0;b…

PID控制參數整定(調節方法)原理+圖示+MATLAB調試

PID控制參數整定&#xff08;調節方法&#xff09;原理圖示MATLAB調試 Chapter1 PID控制參數整定&#xff08;調節方法&#xff09;原理圖示MATLAB調試序一、P參數選取二、I的調節三、D的調節四、總結 Chapter2 PID參數調整&#xff0c;個人經驗&#xff08;配輸出曲線圖&#…

【51單片機系列】獨立按鍵介紹

本文是關于獨立按鍵的介紹及使用。首先介紹了按鍵&#xff0c;包括什么是按鍵及使用按鍵時如何實現軟件消抖。然后使用proteus仿真實現獨立按鍵控制LED指示燈的操作。 之前的LED、蜂鳴器、數碼管中IO口都是作為輸出使用&#xff0c;這里通過獨立按鍵實驗介紹IO口作為輸入的使用…

Edge 中的msedgewebview2總想聯網

目錄預覽 一、問題描述二、原因分析三、解決方案四、參考鏈接 一、問題描述 使用Edge瀏覽器的時候&#xff0c;右下角火絨總會彈出“msedgewebview2”想要聯網的彈窗&#xff0c;如下 點擊發起程序&#xff0c;找到路徑如下&#xff1a; C:\Program Files (x86)\Microsoft\…

zabbix 進階

zabbix的字段發現機制&#xff1a; zabbix客戶端主動和服務端聯系&#xff0c;將自己的地址和端口發送服務端實現字段添加監控主機。 客戶端是主動一方。 缺點&#xff1a;自定義網段中主機數量太多&#xff0c;登記耗時會很久&#xff0c;而且這個自動發現機制不是很穩定。…

centos6.8下載地址

Index of /centos-store/6.8/isos/x86_64/ (liu.se) archive.kernel.org : http - rsynclinuxsoft.cern.ch : http - rsyncmirror.nsc.liu : http - rsync

被遺忘的書籍

C-被遺忘的書籍_牛客小白月賽82 (nowcoder.com) #include <iostream> #include <queue> #include <string> #include <stack> #include <vector> #include <set> #include <map> #include <unordered_map> #include <unor…

計組中各種透明性總結

虛擬存儲器&#xff0c;對應用程序員不可見。主存- cache層由硬件自動完成&#xff0c;對程序員不可見。cache純硬件&#xff0c;程序員不可見。內存&#xff0c;對程序員可見。知識點來源&#xff1a;王道模擬第六套主存-輔存層由硬件和操作系統共同完成&#xff0c;對應用程序…

【Docker一】Docker架構、鏡像操作和容器操作

一、docker基本管理和概念 1、概念 docker&#xff1a;開源的應用容器引擎。基于go語言開發的。運行在Linux系統中的開源的輕量級的“虛擬機” docker的容器技術可用在一臺主機上輕松到達為任何應用創建一個輕量級到的&#xff0c;可移植的&#xff0c;自給自足的容器 dock…

免費的數據采集軟件,最新免費的幾款數據采集軟件【2024】

在當今數字化時代&#xff0c;數據是企業決策和業務發展的關鍵。而如何高效獲取數據成為許多企業和研究機構的關注焦點。本文將深入探討數據采集軟件的種類。幫助大家選擇最適合自己需求的數據采集工具。 數據采集軟件種類 在眾多數據采集軟件中&#xff0c;有一類強大而多樣…

postgresql自帶指令命令系列二

簡介 在安裝postgresql數據庫的時候會需要設置一個關于postgresql數據庫的PATH變量 export PATH/home/postgres/pg/bin:$PATH&#xff0c;該變量會指向postgresql安裝路徑下的bin目錄。這個安裝目錄和我們在進行編譯的時候./configure --prefix [指定安裝目錄] 中的prefix參…

跨境電商運營常用的ChatGPT通用提示詞模板

市場分析&#xff1a;如何分析目標市場&#xff1f; 選品策略&#xff1a;如何選擇要銷售的商品&#xff1f; 供應鏈管理&#xff1a;如何管理供應鏈&#xff1f; 物流解決方案&#xff1a;如何選擇合適的物流解決方案&#xff1f; 跨國支付&#xff1a;如何處理跨國支付&a…

labelimg遇到的標簽修改問題:修改一張圖像的標簽時,保存后導致classes.txt改變

問題描述&#xff1a;修改一張圖像的標簽時候&#xff0c; classes.txt 會同步更新&#xff0c;導致重新生成了 classes.txt 但是這個 classes.txt 只有你現在寫的那個類別名&#xff0c;以前的沒有了。 解決&#xff1a;設置一個 predefined_classes.txt&#xff0c;內容和模…

Metasploit滲透測試的漏洞利用和攻擊方法

預計更新 第一章 Metasploit的使用和配置 1.1 安裝和配置Metasploit 1.2 Metasploit的基礎命令和選項 1.3 高級選項和配置 第二章 滲透測試的漏洞利用和攻擊方法 1.1 滲透測試中常見的漏洞類型和利用方法 1.2 Metasploit的漏洞利用模塊和選項 1.3 模塊編寫和自定義 第三章 Me…

基于ssm理發店會員管理系統的設計和實現論文

摘 要 網絡技術和計算機技術發展至今&#xff0c;已經擁有了深厚的理論基礎&#xff0c;并在現實中進行了充分運用&#xff0c;尤其是基于計算機運行的軟件更是受到各界的關注。加上現在人們已經步入信息時代&#xff0c;所以對于信息的宣傳和管理就很關鍵。因此理發店會員信息…