從數據匯總到高級分析,SQL 查詢進階實戰(下篇)—— 分組、子查詢與窗口函數全攻略

引言:從 “提取數據” 到 “洞察價值”,SQL 進階之路

????????在掌握了基礎查詢與多表關聯后,你是否曾遇到這樣的挑戰:如何按部門統計平均薪資?怎樣找出每個崗位薪資最高的員工?或者如何計算銷售額的月度環比增長率?這些問題的核心,在于從 “簡單提取數據” 升級為 “深度分析數據”

????????本文作為 SQL 查詢系列的下篇,將聚焦分組查詢、子查詢、窗口函數三大核心技術,帶你突破數據處理的瓶頸。你將學習如何用GROUP BY實現 “按類別匯總”,用子查詢解決 “嵌套邏輯” 問題,更能掌握窗口函數的 “黑科技”,輕松實現排名、累計值、移動平均等復雜分析。

目錄

引言:從 “提取數據” 到 “洞察價值”,SQL 進階之路

六、分組查詢和聚合函數

一、統計函數(聚合函數)

特點:

二、分組查詢(GROUP BY)

1. 基本語法

2. 關鍵要點

3. 示例解析

三、單行函數

四、統計函數與分組查詢與單行函數的關系

三者同時使用

七、WHERE 子查詢與 FROM 子查詢

(一)、WHERE 子查詢

1. 語法特點

2. 示例解析

單行子查詢(比較運算):

多行子查詢(IN?或?ANY):

聚合函數子查詢:

3. 關鍵字擴展(ANY/ALL)

= ANY:

< ANY:

> ANY:

> ALL:

< ALL:

(二)、FROM 子查詢

1. 語法特點

2. 示例解析

簡單子查詢作為臨時表:

預先過濾數據:

3. 優勢

(三)、WHERE 子查詢 vs FROM 子查詢

四、總結

八、SELECT查詢

(一)、SELECT 查詢的基礎用法

字段選擇規則

字段別名設置

函數與表達式支持

SELECT子查詢

一、語法特點

二、示例解析

三、使用場景

四、注意事項

九、分頁查詢

(一)、分頁查詢的必要性

(二)、分頁查詢語法(以 MySQL 為例)

語法規則

示例

1. 查詢首頁數據(前 10 條):

2. 查詢第二頁數據(第 11-20 條):

(三)、分頁查詢與其他語法的結合

與排序結合:

與篩選條件結合:

與連接查詢結合:

(四)、分頁查詢的注意事項

十、函數整理

窗口函數

為什么窗口函數對數據分析崗位至關重要?

功能:

1. 基礎語法框架

2. 常用窗口函數類型與示例

1)排名函數

2)聚合函數 + 窗口函數

3)取值函數

3. 窗口幀控制(ROWS vs RANGE)

4. 核心特點總結


六、分組查詢和聚合函數

一、統計函數(聚合函數)

統計函數用于對數據表中的數據進行匯總計算,返回單一結果。常見統計函數包括:

COUNT(字段):統計非NULL值的數量(如統計人數、記錄數)。

  • 示例:
SELECT COUNT(EMPNO) 人數 FROM emp;(統計員工總數)

AVG(字段):計算數值型字段的平均值(如平均工資)。

  • 示例:
SELECT AVG(SAL) 平均工資 FROM emp;(計算所有員工平均工資)。

其他常用函數:SUM(字段)(求和)、MAX(字段)(最大值)、MIN(字段)(最小值)等。

特點

  • 可直接作用于單表,無需分組時,返回整個表的匯總結果。
  • 常與分組查詢結合,對每個分組單獨計算統計結果。

二、分組查詢(GROUP BY)

分組查詢用于將表中的數據按指定字段分組,對每個分組單獨應用統計函數,實現 “按類別匯總” 的需求。

1. 基本語法

SELECT 分組字段1, 分組字段2, 統計函數(字段)
FROM 表名
[WHERE 條件]  -- 分組前篩選原始數據(不涉及統計結果)
GROUP BY 分組字段1, 分組字段2  -- 按字段分組,字段需出現在SELECT中
[HAVING 統計條件]  -- 分組后篩選統計結果(需使用統計函數)
[ORDER BY 排序字段];  -- 對最終結果排序

2. 關鍵要點

WHERE?vs?HAVING

  • WHERE:在分組之前篩選數據,不能使用統計函數(如WHERE AVG(SAL) > 2000?錯誤)。

  • HAVING:在分組之后篩選統計結果,可使用統計函數(如HAVING AVG(SAL) > 2000?正確)。

分組字段GROUP BY?后的字段必須在?SELECT?中出現(除非使用統計函數覆蓋),確保每個分組的唯一性。

3. 示例解析

按崗位分組統計人數:

SELECT JOB, COUNT(EMPNO) 人數 FROM emp GROUP BY JOB;
# 4.查詢每個崗位的詳細信息,包含平均薪資
-- 查詢每個崗位的詳細信息,包含平均薪資
SELECT emp.job 崗位,COUNT(emp.empno) 員工人數,AVG(emp.sal) 平均薪資,MIN(emp.sal) 最低薪資,MAX(emp.sal) 最高薪資,SUM(emp.sal) 薪資總和
FROM emp
GROUP BY emp.job
ORDER BY 平均薪資 DESC;
# 5.查詢每個部門的詳細信息,包含平均薪資
SELECT d.deptno 部門編號,      -- 部門編號(來自 dept 表)d.dname 部門名稱,      -- 部門名稱(來自 dept 表)COUNT(e.empno) 部門人數,AVG(e.sal) 平均薪資
FROM emp e
LEFT JOIN dept d 
ON e.deptno = d.deptno  -- 連接員工表和部門表
GROUP BY d.deptno;  -- 按部門分組(確保部門編號和名稱唯一)

結合右連接查詢,按部門分組并篩選平均薪資高于 2000 的部門:

# 6.#查詢平均薪資高于2000的部門信息
SELECT d.deptno 部門編號,      -- 部門編號(來自 dept 表)d.dname 部門名稱,      -- 部門名稱(來自 dept 表)COUNT(e.empno) 部門人數,AVG(e.sal) 平均薪資
FROM emp e
RIGHT JOIN dept d
USING(DEPTNO) -- 連接員工表和部門表
GROUP BY d.deptno  -- 按部門分組(確保部門編號和名稱唯一)
HAVINGavg(e.SAL) > 2000
ORDER BY  平均薪資 DESC;

三、單行函數

單行函數是對表中的每一行數據單獨處理,返回與原表行數相同的結果。常見類型包括:

  • 字符函數UPPER(字段)(轉大寫)、LOWER(字段)(轉小寫)、LENGTH(字段)(長度)等。

    • 示例:SELECT UPPER(ENAME) FROM emp;(將員工姓名轉為大寫)。

  • 數值函數ROUND(字段, 小數位)(四舍五入)、TRUNC(字段, 小數位)(截斷)等。

    • 示例:SELECT ROUND(SAL, 2) FROM emp;(工資保留兩位小數)。

  • 日期函數SYSDATE()(當前系統時間)、TO_DATE(字符串, 格式)(字符串轉日期)等。

    • 示例:SELECT TO_DATE('2025-01-01', 'YYYY-MM-DD') FROM dual;(將字符串轉為日期)。

  • 轉換函數TO_CHAR(字段, 格式)(日期 / 數值轉字符串)、TO_NUMBER(字符串)(字符串轉數值)等。

    • 示例:SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD') FROM dual;(當前日期轉為字符串)。

特點

  • 處理粒度為 “單行”,不改變表的行數,僅對每行數據進行轉換或計算。

  • 可與統計函數、分組查詢混合使用,實現更復雜的業務邏輯。

SELECT deptno 部門編號,UPPER(ename) 部門名稱大寫,  -- 單行函數:部門名稱轉大寫COUNT(empno) 部門人數,      -- 統計函數:按部門統計人數AVG(sal) 平均薪資           -- 統計函數:按部門計算平均工資
FROM emp
GROUP BY deptno, ename;  -- 分組查詢:按部門編號和名稱分組具體來說,當你使用 GROUP BY 進行分組查詢時,SELECT 后面只能出現兩種類型的列:
出現在 GROUP BY 子句中的列
使用聚合函數(如 SUM(), COUNT(), AVG(), MAX(), MIN() 等)處理過的列

四、統計函數與分組查詢與單行函數的關系

統計函數 vs 單行函數

  • 統計函數:對一組數據(可能是全表或分組)匯總計算,返回單一結果。

  • 單行函數:對每行數據單獨處理,返回與原表行數相同的結果。

分組查詢的橋梁作用

  • 分組查詢通過?GROUP BY?將數據劃分為多個子集,每個子集可應用統計函數生成匯總結果。

  • 單行函數可在分組前對原始數據進行轉換(如日期格式化、字符串處理),或在分組后對統計結果進行二次處理。

例如:

  • 不分組:AVG(SAL)?計算所有員工的平均工資。

# 所有人數
SELECT COUNT(EMPNO) 人數
FROM emp;
# 所有員工平均工資
SELECT AVG(SAL) 平均工資
FROM emp;
  • 按部門分組:GROUP BY deptno?+?AVG(SAL)?計算每個部門的平均工資。

# 統計各崗位平均工資
SELECT JOB 崗位,AVG(SAL) 平均工資
FROM emp
GROUP BY JOB;

三者同時使用

SELECT deptno 部門編號,UPPER(dname) 部門名稱大寫,  -- 單行函數:部門名稱轉大寫COUNT(empno) 部門人數,      -- 統計函數:按部門統計人數AVG(sal) 平均薪資           -- 統計函數:按部門計算平均工資
FROM emp
GROUP BY deptno, dname;  -- 分組查詢:按部門編號和名稱分組
SELECT deptno 部門編號,UPPER(ename) 部門名稱大寫,  -- 單行函數:部門名稱轉大寫COUNT(empno) 部門人數,      -- 統計函數:按部門統計人數AVG(sal) 平均薪資           -- 統計函數:按部門計算平均工資
FROM emp
GROUP BY deptno, ename;  -- 分組查詢:按部門編號和名稱分組具體來說,當你使用 GROUP BY 進行分組查詢時,SELECT 后面只能出現兩種類型的列:
出現在 GROUP BY 子句中的列
使用聚合函數(如 SUM(), COUNT(), AVG(), MAX(), MIN() 等)處理過的列

七、WHERE 子查詢與 FROM 子查詢

(一)、WHERE 子查詢

定義:子查詢出現在?WHERE?或?HAVING?子句中,作為條件表達式的一部分,用于篩選主查詢的數據。

1. 語法特點

子查詢結果需能作為條件值條件列表,常見形式:

  • 單行子查詢:返回單一值,用于?=><?等比較運算。

  • 多行子查詢:返回多個值,用于?INANYALL?等邏輯運算。

執行順序:先執行子查詢,再將結果作為條件篩選主查詢數據。

2. 示例解析

單行子查詢(比較運算)
-- 查詢比SMITH工資高的員工信息
SELECT *
FROM emp
WHERE SAL > (SELECT SAL FROM emp WHERE ENAME = 'SMITH')
ORDER BY SAL DESC;

子查詢?(SELECT SAL FROM emp WHERE ENAME = 'SMITH')?返回 SMITH 的工資(單行值)。

主查詢篩選工資大于該值的員工。

多行子查詢(IN?或?ANY):
-- 查詢與銷售崗位薪資相同的員工信息
SELECT *
FROM emp
WHERE SAL IN (SELECT SAL FROM emp WHERE JOB = 'SALESMAN');

子查詢返回所有銷售崗位的薪資(多行值)。

主查詢篩選薪資在該列表中的員工。

聚合函數子查詢:
-- 查詢比平均工資高的員工信息
SELECT *
FROM emp
WHERE SAL > (SELECT AVG(SAL) FROM emp);

3. 關鍵字擴展(ANY/ALL)

= ANY:

等價于?IN,匹配列表中任意一個值。

SELECT *
FROM emp
WHERE SAL = ANY (SELECT SAL FROM emp WHERE JOB = 'SALESMAN');
< ANY:

小于列表中的最大值。

SELECT *
FROM emp
WHERE SAL < ANY (SELECT SAL FROM emp WHERE JOB = 'SALESMAN');
> ANY:

比最小值大的數據

> ALL:

大于列表中的最大值。

< ALL:

小于列表中的最小值。

(二)、FROM 子查詢

定義:子查詢出現在?FROM?子句中,作為主查詢的 “臨時表”,需為子查詢指定別名。

1. 語法特點

  • 子查詢結果作為數據源,主查詢對其進行二次篩選或關聯。

  • 子查詢可預先過濾數據,減少主查詢的處理量。

  • 執行順序:先執行子查詢生成臨時表,再執行主查詢。

2. 示例解析

簡單子查詢作為臨時表
-- 與WHERE子查詢示例1結果相同,但語法結構不同
SELECT *
FROM (SELECT *FROM empWHERE SAL > (SELECT SAL FROM emp WHERE ENAME = 'SMITH')
) AS high_sal_emp  -- 必須指定別名
ORDER BY SAL DESC;

子查詢生成 “工資高于 SMITH 的員工” 臨時表。

主查詢對臨時表按工資降序排序。

預先過濾數據:
SELECT *
FROM (SELECT empno, ename, sal, deptnoFROM empWHERE job = 'SALESMAN'
) AS salesmen
WHERE sal >= 1500;

子查詢預先篩選出銷售崗位的員工。

主查詢在臨時表基礎上,進一步篩選薪資≥1500 的員工。

3. 優勢

邏輯分層:將復雜查詢拆分為 “數據準備層”(子查詢)和 “結果處理層”(主查詢),便于維護。

性能優化:子查詢可提前過濾冗余數據,減少主查詢的計算量。

(三)、WHERE 子查詢 vs FROM 子查詢

維度

WHERE 子查詢

FROM 子查詢

位置

出現在WHERE/HAVING子句中

出現在FROM子句中

作用

作為條件篩選主查詢數據

作為數據源(臨時表)供主查詢使用

執行順序

先執行子查詢,再執行主查詢

先執行子查詢生成臨時表,再執行主查詢

子查詢結果

需為單一值或值列表(匹配條件)

需為完整數據集(可含多字段、多行)

別名要求

無需別名

必須為子查詢指定別名(臨時表名)

典型場景

基于子查詢結果的條件篩選(如 “比 SMITH 工資高”)

復雜數據預處理(如 “先篩選銷售崗位,再處理薪資”)

四、總結

WHERE 子查詢:適用于將子查詢結果作為條件,直接篩選主查詢數據,語法簡潔,適合簡單條件判斷。

FROM 子查詢:適用于復雜數據預處理,通過臨時表分層處理邏輯,便于維護和性能優化。

兩者可結合使用,實現更復雜的業務需求(如子查詢嵌套、多表關聯等)。

八、SELECT查詢

定義SELECT?是 SQL 中用于從表中提取數據的基礎關鍵字,所有查詢操作均以?SELECT?開頭,決定返回哪些字段及如何展示。

(一)、SELECT 查詢的基礎用法

  • 字段選擇規則

  • 可選擇表中所有字段:用?*?表示(如?SELECT * FROM emp;),適合快速查看全表數據,但效率較低(不推薦大數據量場景)。

  • 可選擇指定字段:用逗號分隔字段名(如?SELECT EMPNO, ENAME, SAL FROM emp;),僅返回所需數據,減少資源消耗。

  • 支持字段去重:在字段前加?DISTINCT(如?SELECT DISTINCT JOB FROM emp;),僅保留該字段的唯一值(DISTINCT?僅對緊跟的第一個字段生效)。

  • 字段別名設置

  • 為字段指定可讀性更強的別名(尤其適合中文展示),語法:字段名 別名?或?字段名 AS 別名AS?可省略)。

  • 示例:SELECT ENAME 姓名, JOB 職位, SAL 薪資 FROM emp;

  • 函數與表達式支持

可在?SELECT?后直接使用單行函數處理字段(如字符轉換、數值計算等):

SELECT UPPER(ENAME) 姓名大寫, ROUND(SAL, 2) 薪資保留兩位小數 FROM emp;

可在?SELECT?后使用統計函數(聚合函數)進行匯總計算(常與?GROUP BY?結合):

SELECT JOB, COUNT(EMPNO) 人數, AVG(SAL) 平均薪資 FROM emp GROUP BY JOB;

可嵌套子查詢作為字段值,返回與主查詢行數一致的結果

SELECT ENAME, SAL, (SELECT MAX(SAL) FROM emp) 最高工資 FROM emp;

SELECT子查詢

定義SELECT子查詢是嵌套在SELECT子句中的子查詢,作為主查詢返回結果的一個字段值,其結果與主查詢的行數保持一致(每行返回一個對應值)。

一、語法特點

  1. 位置:出現在SELECT子句中,作為一個 “虛擬字段” 存在。

  2. 結果要求:子查詢需返回單行單列的值(即單個數值或字符串),確保與主查詢的每行記錄一一對應。

  3. 執行邏輯:主查詢每讀取一行數據,子查詢會執行一次,返回對應的值作為該字段的結果。

二、示例解析

SELECT ENAME 姓名,SAL 薪資,(SELECT MAX(SAL) FROM emp) AS 最高工資  -- SELECT子查詢:返回全表最高工資
FROM emp;
  • 子查詢(SELECT MAX(SAL) FROM emp)獨立計算全表最高工資(單行單列結果)。

  • 主查詢返回每位員工的姓名、薪資,同時將子查詢結果作為 “最高工資” 字段,與每行員工信息對應。

三、使用場景

  1. 關聯單行數據:獲取與主查詢每行記錄相關的單行參考值(如對比個人薪資與全表最高薪資)。

  2. 簡化多步查詢:無需單獨執行子查詢再手動關聯結果,直接在SELECT中嵌套實現。

四、注意事項

  1. 子查詢必須返回單行單列結果,否則會報錯(如返回多行時需配合LIMIT 1等限制)。

  2. 避免在大數據量場景中過度使用,因每行執行一次子查詢可能導致性能下降(可通過關聯查詢優化)。

總結SELECT子查詢通過在字段列表中嵌套單行子查詢,為每條主查詢記錄附加一個動態計算的參考值,適用于需對比或補充單行關聯數據的場景。

九、分頁查詢

(一)、分頁查詢的必要性

  • 性能優化:當表數據量龐大時(如百萬級記錄),一次性查詢所有數據會導致:

  • 數據庫查詢耗時久,占用大量內存。

  • 網絡傳輸數據量大,前端渲染壓力大。分頁查詢可按需獲取數據,顯著提升效率。

  • 用戶體驗:網頁或應用中,分頁展示數據更符合用戶瀏覽習慣(如 “下一頁”“上一頁” 按鈕),避免信息過載。

(二)、分頁查詢語法(以 MySQL 為例)

關鍵字LIMIT n, m

  • n:起始數據的索引(從 0 開始)。

  • m:每頁顯示的條數

語法規則

SELECT 字段 FROM 表名
[WHERE 條件]
[ORDER BY 排序字段]
LIMIT n, m;

示例

1. 查詢首頁數據(前 10 條):
SELECT * FROM emp LIMIT 0, 10;  -- 或簡寫為 LIMIT 10
  • n=0?表示從第一條數據開始(索引 0)。
  • m=10?表示每頁顯示 10 條。
2. 查詢第二頁數據(第 11-20 條):
SELECT * FROM emp LIMIT 10, 10;
  • n=10?表示從第 11 條數據開始(索引 10)。
  • m=10?表示每頁顯示 10 條。

(三)、分頁查詢與其他語法的結合

與排序結合:

分頁前需對數據排序,確保每頁數據的順序一致。

SELECT * FROM emp
ORDER BY SAL DESC  -- 按工資降序排序
LIMIT 10, 10;      -- 查詢第二頁數據

與篩選條件結合:

先篩選數據,再分頁展示。

SELECT * FROM emp
WHERE DEPTNO = 10  -- 僅查詢部門10的員工
LIMIT 0, 5;        -- 每頁顯示5條

與連接查詢結合:

多表關聯后分頁展示結果。

SELECT e.ENAME, d.DNAME
FROM emp e 
LEFT JOIN dept d 
ON e.DEPTNO = d.DEPTNO
LIMIT 0, 5;

(四)、分頁查詢的注意事項

  1. 數據庫兼容性

  • MySQL 使用?LIMIT n, m

  • Oracle 使用?ROWNUM?或?OFFSET...FETCH(如?OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY)。

  • SQL Server 使用?OFFSET...FETCH(與 Oracle 類似)。

  1. 索引優化:分頁查詢時,若涉及排序字段,需確保該字段有索引,否則大量數據排序會導致性能下降。

  2. 動態計算頁碼:在實際應用中,頁碼需根據總記錄數和每頁條數動態計算,例如:

  • 總記錄數:SELECT COUNT(*) FROM emp;

  • 總頁數:CEIL(總記錄數 / 每頁條數)

SELECT COUNT(*) FROM emp;
SELECT CEIL((SELECT COUNT(*) FROM emp) / 10);

十、函數整理

窗口函數

窗口函數是現代數據分析中處理復雜計算、排名、移動平均、累計值、分區內比較等任務的利器,是數據分析師日常工作中頻繁使用的工具。

為什么窗口函數對數據分析崗位至關重要?

  1. 處理復雜排名和分位數: 計算銷售排名、部門內薪資排名、成績百分位等(ROW_NUMBER(), RANK(), DENSE_RANK(), NTILE(), PERCENT_RANK(), CUME_DIST())。

  2. 計算趨勢和移動指標: 計算滾動平均銷售額、移動總和、環比/同比變化等(SUM() OVER(...), AVG() OVER(...), 結合 ROWS/RANGE 子句)。

  3. 訪問前后行數據: 分析用戶行為序列(如上一步/下一步操作)、計算與前一行的差值或比率(LAG(), LEAD())。

  4. 分區內聚合而不折疊行: 計算每個員工薪資占其部門總薪資的比例、計算每個客戶訂單總額的同時保留訂單明細(SUM() OVER(PARTITION BY ...))。

  5. 累積計算: 計算年初至今(YTD)銷售額、累計用戶數等(SUM() OVER(ORDER BY ... ROWS UNBOUNDED PRECEDING))。

  6. 高效處理“Top N per Group”問題: 找出每個部門薪資最高的前3名員工(結合 ROW_NUMBER() 或 RANK() 和子查詢/CTE)。

功能:

對數據的指定分區(窗口) 進行跨行計算,不折疊結果集(保留原始行),實現排名、累積、移動平均等復雜分析。

與 GROUP BY 關鍵區別:

維度

GROUP BY

(分組聚合)

窗口函數

結果行數

折疊為分組數(行數減少)

保留原表行數(行數不變)

計算粒度

每組返回一個匯總值

每行返回基于窗口的獨立計算結果

典型場景

部門平均工資、崗位人數統計

部門內薪資排名、累計銷售額分析

1. 基礎語法框架

SELECT  字段1,  字段2,  窗口函數() OVER (  [PARTITION BY 分區字段]  -- 將數據劃分為多個窗口(類似分組)  [ORDER BY 排序字段]      -- 窗口內數據排序(影響排名、累積計算)  [ROWS/RANGE 窗口幀]      -- 定義計算范圍(如 "當前行前3行")  ) AS 別名  
FROM 表名;  

2. 常用窗口函數類型與示例

1)排名函數

函數

功能說明

示例場景

ROW_NUMBER()

為分區內每行生成唯一連續序號

按部門給員工薪資排名(無并列)

RANK()

并列時跳過后續序號(1,1,3)

銷售業績排名(允許名次并列)

DENSE_RANK()

并列時不跳號(1,1,2)

學生成績等級排名(緊密排序)

示例:查詢每個部門內員工的薪資排名(允許并列)

SELECT  DEPTNO 部門編號,  ENAME 員工姓名,  SAL 薪資,  RANK() OVER (  PARTITION BY DEPTNO    -- 按部門分區  ORDER BY SAL DESC      -- 薪資降序排序  ) AS 部門內薪資排名  
FROM emp;  

結果示例:

部門編號

員工姓名

薪資

部門內薪資排名

10

KING

5000

1

10

CLARK

2450

2

20

SCOTT

3000

1

20

FORD

3000

1

-- 并列第一

20

ADAMS

1100

3

-- RANK() 跳過2

2)聚合函數 + 窗口函數

功能:在分區內計算聚合值(如累加、移動平均),不折疊行。

常用函數:

SUM(字段) OVER (...)  -- 累計求和  
AVG(字段) OVER (...)  -- 移動平均  
MAX/MIN(字段) OVER (...)  

示例1:計算每位員工的累計薪資(按入職順序累加)

SELECT  ENAME,  HIREDATE,  SAL,  SUM(SAL) OVER (  ORDER BY HIREDATE   -- 按入職日期排序  ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW  -- 從首行到當前行  ) AS 累計薪資  
FROM emp;  
3)取值函數

函數

功能說明

LAG(字段, N)

獲取當前行前N行的數據

LEAD(字段, N)

獲取當前行后N行的數據

FIRST_VALUE(字段)

返回窗口內第一行的值

LAST_VALUE(字段)

返回窗口內最后一行的值

示例:分析每月銷售額環比增長率

SELECT  sale_month,  sales,  LAG(sales, 1) OVER (ORDER BY sale_month) AS 上月銷售額,  (sales - LAG(sales, 1) OVER (ORDER BY sale_month)) / LAG(sales, 1) OVER (ORDER BY sale_month) AS 環比增長率  
FROM sales_table;  

3. 窗口幀控制(ROWS vs RANGE)

關鍵字

說明

示例

ROWS

物理行

范圍(推薦使用)

ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING

(當前行前后各1行)

RANGE

邏輯值

范圍(易混淆)

RANGE BETWEEN 100 PRECEDING AND 200 FOLLOWING

(值在±100內)

常用幀范圍:

ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW  -- 從分區開始到當前行(累計算)  
ROWS BETWEEN 3 PRECEDING AND 1 FOLLOWING         -- 前3行到后1行  
ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING -- 當前行到分區結束  

4. 核心特點總結

  1. 不折疊結果:保留原表所有行,新增計算列,適合明細級分析報告。
  2. 分層計算:通過 PARTITION BY 實現“組內分析”(如部門內排名)。
  3. 動態范圍:ORDER BY + 窗口幀 支持時間序列分析(移動平均、累計值)。
  4. 性能優化:比自連接/子查詢更高效處理復雜分析(如 Top N 問題)。
  5. 面試重點:數據分析崗位必考,用于解決:
  • 排名問題(ROW_NUMBER(), RANK())
  • 趨勢分析(LAG()/LEAD(), 移動平均)
  • 占比計算(SUM() OVER(PARTITION BY))

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

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

相關文章

Spring 和 Lettuce 源碼分析 Redis 節點狀態檢查與失敗重連的工作原理

關鍵步驟&#xff1a;Spring Boot 啟動時創建 LettuceConnectionFactory根據配置類型&#xff08;集群/哨兵/單機&#xff09;初始化客戶端對于集群模式&#xff1a;創建 RedisClusterClient調用 setOptions(getClusterClientOptions(configuration)) 應用配置2. 節點狀態檢查機…

從ChatGPT到智能助手:Agent智能體如何顛覆AI應用

從ChatGPT到智能助手&#xff1a;Agent智能體如何顛覆AI應用 更多大模型知識分享&#xff0c;盡在>>>GitHub<<< Agent 智能體是什么 簡單來說&#xff0c;Agent 智能體是一種能夠感知環境&#xff0c;并根據自身目標自主采取行動的智能實體。它就像是一個擁…

Spring Boot應用實現圖片資源服務

在這篇文章中&#xff0c;我們將介紹如何使用Spring Boot創建一個REST API來提供服務器上的靜態圖片資源。該API包括路徑安全檢查、文件存在性驗證以及緩存控制等功能&#xff0c;并且代碼包含詳細的注釋以幫助理解。Maven依賴 首先&#xff0c;在您的pom.xml文件中添加以下依賴…

Word 中 MathType 公式編號問題與解決

注&#xff1a;本文為 “Word 中 MathType 公式編號” 相關合輯。 圖片清晰度受引文原圖所限。 略作重排&#xff0c;未整理去重。 如有內容異常&#xff0c;請看原文。 【Word】解決 MathType 已插入公式按新章節開始編號的問題 Allan326 于 2020-03-25 15:30:08 發布 問題…

19. 大數據-產品概念

文章目錄前言一、數據庫1. 簡介2. 使用場景3. 數據庫類型4. 數據類型二、數據倉庫1. 簡介2. 使用場景3. 數據倉庫架構三、數據平臺1. 簡介2. 使用場景3. 數據倉庫架構四、數據中臺1. 簡介2. 使用場景3. 數據中臺架構五、數據湖1. 簡介2. 使用場景3. 數據湖架構六、總結1. 區別2…

python學習DAY46打卡

DAY 46 通道注意力(SE注意力) 內容&#xff1a; 不同CNN層的特征圖&#xff1a;不同通道的特征圖什么是注意力&#xff1a;注意力家族&#xff0c;類似于動物園&#xff0c;都是不同的模塊&#xff0c;好不好試了才知道。通道注意力&#xff1a;模型的定義和插入的位置通道注意…

Ansible 中的文件包含與導入機制

Ansible 中的文件包含與導入機制本文介紹了在 Ansible 中如何通過模塊化方式管理復雜的 Playbook&#xff0c;包括使用 include 和 import 系列語句來拆分和重用代碼。概述 當 Playbook 變得冗長或復雜時&#xff0c;可以將其拆分為多個小文件以提高可管理性。Ansible 提供了模…

OpenCV-循環讀取視頻幀,對每一幀進行處理

原型代碼 內存模型&#xff1a; 核心變量&#xff1a;frame&#xff0c;Numpy ndarray&#xff0c;每次會被覆蓋&#xff0c;大小保持恒定import cv2video_path your_video.mp4cap cv2.VideoCapture(video_path)if not cap.isOpened():print("Cant open Video")exi…

決策樹的學習(二)

一、整體框架本 PPT 聚焦機器學習中的決策樹算法&#xff0c;圍繞 “核心算法&#xff08;ID3、C4.5、CART&#xff09;→ 特殊問題&#xff08;連續值處理&#xff09;→ 優化策略&#xff08;剪枝&#xff09;→ 代碼實現→ 課堂練習” 展開&#xff0c;系統補充決策樹的進階…

粗糧廠的基于spark的通用olap之間的同步工具項目

粗糧廠的基于spark的通用olap之間的同步工具項目1 項目背景2 項目實現2.1 實現原理2.2 細節要點3 抽樣說明4 項目運行狀態4.1 運行速度4.2 項目吞吐4.3 穩定性說的比較簡單&#xff0c;有需要的可以留言&#xff0c;我不斷補充完善1 項目背景 我們公司內部的需要一款&#xff…

C# 時間戳

在C#中&#xff0c;獲取當前時間的毫秒級時間戳可以通過多種方式實現。以下是幾種常見的方法&#xff1a;方法1&#xff1a;使用DateTime和DateTimeOffsetlong timestamp (long)(DateTimeOffset.Now.ToUnixTimeMilliseconds()); Console.WriteLine(timestamp);方法2&#xff1…

【牛客刷題】REAL792 小O的平面畫圓

文章目錄 一、題目介紹 1.1 輸入描述 1.2 輸出描述 1.3 示例 二、算法設計思路 2.1 核心問題分析 2.2 圖解兩個圓的位置關系 2.2.1. 相離 (Separate) 2.2.2. 外切 (Externally Tangent) 2.2.3. 相交 (Intersecting) 2.2.4. 內切 (Internally Tangent) 2.2.5. 包含 (Containing)…

uniapp:微信小程序使用Canvas 和Canvas 2D繪制圖形

一、Canvas 畫布 canvas 組件 提供了繪制界面&#xff0c;可以在之上進行任意繪制 功能描述 Canvas 畫布。2.9.0 起支持一套新 Canvas 2D 接口&#xff08;需指定 type 屬性&#xff09;&#xff0c;同時支持同層渲染&#xff0c;原有接口不再維護。 二、Canvas 和Canvas 2D 區…

word如何轉換為pdf

pip install pywin32import os import win32com.client import pythoncom # 新增&#xff1a;用于處理COM線程 import sysdef docx_to_pdf(docx_path, pdf_pathNone):"""將Word文檔轉換為PDF格式&#xff0c;修復退出時的COM錯誤"""if not os.p…

服務器Linux防火墻怎樣實現訪問控制

在互聯網世界里&#xff0c;Linux服務器就像一座城池&#xff0c;而防火墻便是城池的守衛者。沒有防火墻&#xff0c;外部的任何流量都能毫無阻攔地進入服務器;而有了防火墻&#xff0c;就可以像設關卡一樣&#xff0c;對進出城門的人進行盤查和控制。對企業運維人員來說&#…

【原創理論】Stochastic Coupled Dyadic System (SCDS):一個用于兩性關系動力學建模的隨機耦合系統框架

【原創理論】Stochastic Coupled Dyadic System (SCDS)&#xff1a;一個用于兩性關系動力學建模的隨機耦合系統框架 作者&#xff1a;[望月&#xff0c;GPT5,GPT-O3,Gemini2.5pro] 分類&#xff1a; 人工智能 理論模型 交叉學科 系統科學 人性 愛情 標簽&#xff1a; 關系動力…

星圖云開發者平臺新功能速遞 | 微服務管理器:無縫整合異構服務,釋放云原生開發潛能

在構建現代數字化應用的過程中&#xff0c;開發者常常面臨一個關鍵挑戰&#xff1a;如何高效、安全地集成和復用既有的復雜服務或自有業務系統&#xff1f;這些服務可能是核心算法引擎、遺留業務邏輯模塊&#xff0c;或是特定的SaaS能力。傳統方式下&#xff0c;將它們融入新的…

數據結構:構建 (create) 一個二叉樹

目錄 問題的本質——什么信息才能唯一確定一棵樹&#xff1f; 推導“最佳拍檔”——哪兩種遍歷序列能行&#xff1f; 遞歸思想——如何構建一棵樹&#xff1f; 第1步&#xff1a;確定整棵樹的根節點 第2步&#xff1a;劃分左右子樹的成員 第3步&#xff1a;遞歸構建左右子…

【STM32】HAL庫中的實現(五):ADC (模數轉換)

什么是 ADC&#xff08;模數轉換器&#xff09; ADC&#xff08;Analog to Digital Converter&#xff09;是將 模擬信號&#xff08;電壓&#xff09;轉換成數字信號&#xff08;數值&#xff09; 的器件。 在 STM32 中&#xff0c;ADC 通常具有以下特性&#xff1a;特性描述分…

智慧校園中IPTV融合對講:構建高效溝通新生態

在智慧校園的建設浪潮里&#xff0c;IPTV融合對講系統宛如一顆璀璨的新星&#xff0c;以其獨特的功能和強大的優勢&#xff0c;為校園的溝通與管理帶來了全新的變革&#xff0c;構建起一個高效、便捷、智能的溝通新生態。從日常溝通層面來看&#xff0c;IPTV融合對講系統打破了…