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

SQL?Server窗口函數(shù)詳細(xì)指南(函數(shù)用法與場(chǎng)景)

 更新時(shí)間:2025年10月31日 10:49:02   作者:nbsaas-boot  
窗口函數(shù)是整個(gè)SQL語(yǔ)句最后被執(zhí)行的部分,這意味著窗口函數(shù)是在SQL查詢的結(jié)果集上進(jìn)行的,因此不會(huì)受到Group?By,?Having,Where子句的影響,這篇文章主要介紹了SQL?Server窗口函數(shù)的相關(guān)資料,需要的朋友可以參考下

前言

SQL Server 中的窗口函數(shù)(Window Functions)是一種強(qiáng)大的查詢工具,它允許我們?cè)诓樵兘Y(jié)果集中對(duì)數(shù)據(jù)進(jìn)行分區(qū)、排序和計(jì)算,而不會(huì)改變結(jié)果集的行數(shù)。窗口函數(shù)通過(guò) OVER 子句定義一個(gè)“窗口”,在該窗口內(nèi)對(duì)數(shù)據(jù)進(jìn)行操作。這使得我們能夠輕松實(shí)現(xiàn)排名、聚合、移動(dòng)平均等復(fù)雜計(jì)算,而無(wú)需使用子查詢或自連接。

窗口函數(shù)的基本語(yǔ)法是:

窗口函數(shù) OVER (
    [PARTITION BY 分區(qū)列]
    [ORDER BY 排序列 [ASC|DESC]]
    [ROWS | RANGE BETWEEN 邊界1 AND 邊界2]
)
  • PARTITION BY:將結(jié)果集分成多個(gè)分區(qū),每個(gè)分區(qū)獨(dú)立計(jì)算。
  • ORDER BY:定義窗口內(nèi)的排序順序。
  • ROWS/RANGE:可選,定義窗口幀(frame),指定計(jì)算的行范圍。

窗口函數(shù)主要分為三類:排名函數(shù)、聚合函數(shù)和分析函數(shù)。下面我們逐一介紹每個(gè)函數(shù)的具體用法和使用場(chǎng)景。為了說(shuō)明,我們假設(shè)有一個(gè)名為 Sales 的表,結(jié)構(gòu)如下:

OrderIDProductQuantityPriceOrderDate
1A101002023-01-01
2B202002023-01-02
3A151502023-01-03

窗口函數(shù)完整列表

排名函數(shù)(Ranking Functions)

  1. ROW_NUMBER() - 為每行分配唯一的連續(xù)整數(shù)
  2. RANK() - 分配排名,相同值相同排名,有間隙
  3. DENSE_RANK() - 分配排名,相同值相同排名,無(wú)間隙
  4. NTILE(n) - 將數(shù)據(jù)分成n個(gè)組

聚合函數(shù)(Aggregate Functions)

  1. SUM() - 計(jì)算窗口內(nèi)總和
  2. AVG() - 計(jì)算窗口內(nèi)平均值
  3. MIN() - 計(jì)算窗口內(nèi)最小值
  4. MAX() - 計(jì)算窗口內(nèi)最大值
  5. COUNT() - 計(jì)算窗口內(nèi)行數(shù)
  6. STDEV() - 計(jì)算窗口內(nèi)標(biāo)準(zhǔn)差
  7. STDEVP() - 計(jì)算窗口內(nèi)總體標(biāo)準(zhǔn)差
  8. VAR() - 計(jì)算窗口內(nèi)方差
  9. VARP() - 計(jì)算窗口內(nèi)總體方差

分析函數(shù)(Analytic Functions)

  1. LEAD() - 訪問(wèn)后續(xù)行的值
  2. LAG() - 訪問(wèn)前面行的值
  3. FIRST_VALUE() - 獲取窗口內(nèi)第一個(gè)值
  4. LAST_VALUE() - 獲取窗口內(nèi)最后一個(gè)值
  5. NTH_VALUE() - 獲取窗口內(nèi)第n個(gè)值

分布函數(shù)(Distribution Functions)

  1. PERCENT_RANK() - 計(jì)算相對(duì)排名(0-1)
  2. CUME_DIST() - 計(jì)算累計(jì)分布(0-1)
  3. PERCENTILE_CONT() - 連續(xù)百分位數(shù)
  4. PERCENTILE_DISC() - 離散百分位數(shù)

每個(gè)函數(shù)詳細(xì)介紹

1. ROW_NUMBER()

函數(shù)說(shuō)明:為結(jié)果集中的每一行分配一個(gè)唯一的連續(xù)整數(shù),從1開(kāi)始遞增。相同值的行會(huì)獲得不同的行號(hào)。

語(yǔ)法

ROW_NUMBER() OVER (
    [PARTITION BY 分區(qū)列1, 分區(qū)列2, ...]
    ORDER BY 排序列1 [ASC|DESC], 排序列2 [ASC|DESC], ...
)

參數(shù)說(shuō)明

  • PARTITION BY:可選,將結(jié)果集分成多個(gè)分區(qū),每個(gè)分區(qū)獨(dú)立編號(hào)
  • ORDER BY:必需,定義排序順序,決定行號(hào)的分配

示例

-- 按產(chǎn)品分組,按數(shù)量降序編號(hào)
SELECT 
    Product,
    Quantity,
    ROW_NUMBER() OVER (PARTITION BY Product ORDER BY Quantity DESC) AS RowNum
FROM Sales;

-- 全局按價(jià)格降序編號(hào)
SELECT 
    Product,
    Price,
    ROW_NUMBER() OVER (ORDER BY Price DESC) AS GlobalRank
FROM Sales;

使用場(chǎng)景

  • 分頁(yè)查詢(LIMIT OFFSET)
  • 刪除重復(fù)記錄
  • 生成唯一標(biāo)識(shí)符
  • 數(shù)據(jù)抽樣

2. RANK()

函數(shù)說(shuō)明:為行分配排名,相同值的行獲得相同排名,下一個(gè)排名會(huì)跳過(guò)(產(chǎn)生間隙)。

語(yǔ)法

RANK() OVER (
    [PARTITION BY 分區(qū)列1, 分區(qū)列2, ...]
    ORDER BY 排序列1 [ASC|DESC], 排序列2 [ASC|DESC], ...
)

示例

-- 按價(jià)格排名,相同價(jià)格相同排名
SELECT 
    Product,
    Price,
    RANK() OVER (ORDER BY Price DESC) AS PriceRank
FROM Sales;

結(jié)果示例

Product | Price | PriceRank
--------|-------|----------
A       | 200   | 1
B       | 200   | 1
C       | 150   | 3  (跳過(guò)了2)
D       | 100   | 4

使用場(chǎng)景

  • 競(jìng)賽排名
  • 成績(jī)排名
  • 銷售排行榜

3. DENSE_RANK()

函數(shù)說(shuō)明:類似于RANK,但排名連續(xù),沒(méi)有間隙。相同值的行獲得相同排名,下一個(gè)排名連續(xù)。

語(yǔ)法

DENSE_RANK() OVER (
    [PARTITION BY 分區(qū)列1, 分區(qū)列2, ...]
    ORDER BY 排序列1 [ASC|DESC], 排序列2 [ASC|DESC], ...
)

示例

SELECT 
    Product,
    Price,
    DENSE_RANK() OVER (ORDER BY Price DESC) AS DenseRank
FROM Sales;

結(jié)果示例

Product | Price | DenseRank
--------|-------|----------
A       | 200   | 1
B       | 200   | 1
C       | 150   | 2  (連續(xù),沒(méi)有跳躍)
D       | 100   | 3

使用場(chǎng)景

  • 獎(jiǎng)牌排名(金銀銅)
  • 等級(jí)評(píng)定
  • 需要連續(xù)排名的場(chǎng)景

4. NTILE(n)

函數(shù)說(shuō)明:將分區(qū)內(nèi)的行分成n個(gè)組,每組分配一個(gè)從1到n的數(shù)字。如果行數(shù)不能被n整除,前面的組會(huì)多一行。

語(yǔ)法

NTILE(組數(shù)) OVER (
    [PARTITION BY 分區(qū)列1, 分區(qū)列2, ...]
    ORDER BY 排序列1 [ASC|DESC], 排序列2 [ASC|DESC], ...
)

示例

-- 將數(shù)據(jù)分成4個(gè)四分位數(shù)
SELECT 
    Product,
    Price,
    NTILE(4) OVER (ORDER BY Price DESC) AS Quartile
FROM Sales;

使用場(chǎng)景

  • 分位數(shù)分析
  • 數(shù)據(jù)分桶
  • 等級(jí)劃分(如A、B、C、D級(jí))

5. SUM()

函數(shù)說(shuō)明:計(jì)算窗口內(nèi)列的總和,支持累計(jì)計(jì)算。

語(yǔ)法

SUM(列) OVER (
    [PARTITION BY 分區(qū)列1, 分區(qū)列2, ...]
    [ORDER BY 排序列1 [ASC|DESC], 排序列2 [ASC|DESC], ...]
    [ROWS | RANGE BETWEEN 邊界1 AND 邊界2]
)

窗口幀選項(xiàng)

  • ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW - 累計(jì)到當(dāng)前行
  • ROWS BETWEEN 3 PRECEDING AND CURRENT ROW - 當(dāng)前行及前3行
  • ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING - 當(dāng)前行到末尾

示例

-- 累計(jì)銷售總額
SELECT 
    OrderDate,
    Price,
    SUM(Price) OVER (ORDER BY OrderDate) AS RunningTotal
FROM Sales;

-- 按產(chǎn)品分組的累計(jì)銷售
SELECT 
    Product,
    OrderDate,
    Price,
    SUM(Price) OVER (PARTITION BY Product ORDER BY OrderDate) AS ProductRunningTotal
FROM Sales;

-- 移動(dòng)3天平均
SELECT 
    OrderDate,
    Price,
    AVG(Price) OVER (ORDER BY OrderDate ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) AS MovingAvg3
FROM Sales;

使用場(chǎng)景

  • 財(cái)務(wù)累計(jì)報(bào)表
  • 銷售趨勢(shì)分析
  • 移動(dòng)平均計(jì)算

6. AVG()

函數(shù)說(shuō)明:計(jì)算窗口內(nèi)列的平均值。

語(yǔ)法

AVG(列) OVER (
    [PARTITION BY 分區(qū)列1, 分區(qū)列2, ...]
    [ORDER BY 排序列1 [ASC|DESC], 排序列2 [ASC|DESC], ...]
    [ROWS | RANGE BETWEEN 邊界1 AND 邊界2]
)

示例

-- 每個(gè)產(chǎn)品的平均價(jià)格
SELECT 
    Product,
    Price,
    AVG(Price) OVER (PARTITION BY Product) AS AvgPrice
FROM Sales;

-- 移動(dòng)平均
SELECT 
    OrderDate,
    Price,
    AVG(Price) OVER (ORDER BY OrderDate ROWS BETWEEN 4 PRECEDING AND CURRENT ROW) AS MovingAvg5
FROM Sales;

使用場(chǎng)景

  • 趨勢(shì)分析
  • 股票技術(shù)分析
  • 性能基準(zhǔn)

7. MIN() / MAX()

函數(shù)說(shuō)明:計(jì)算窗口內(nèi)列的最小值/最大值。

語(yǔ)法

MIN(列) OVER (
    [PARTITION BY 分區(qū)列1, 分區(qū)列2, ...]
    [ORDER BY 排序列1 [ASC|DESC], 排序列2 [ASC|DESC], ...]
    [ROWS | RANGE BETWEEN 邊界1 AND 邊界2]
)

MAX(列) OVER (
    [PARTITION BY 分區(qū)列1, 分區(qū)列2, ...]
    [ORDER BY 排序列1 [ASC|DESC], 排序列2 [ASC|DESC], ...]
    [ROWS | RANGE BETWEEN 邊界1 AND 邊界2]
)

示例

-- 每個(gè)產(chǎn)品的歷史最高價(jià)和最低價(jià)
SELECT 
    Product,
    Price,
    MIN(Price) OVER (PARTITION BY Product) AS MinPrice,
    MAX(Price) OVER (PARTITION BY Product) AS MaxPrice
FROM Sales;

使用場(chǎng)景

  • 價(jià)格監(jiān)控
  • 極值分析
  • 范圍計(jì)算

8. COUNT()

函數(shù)說(shuō)明:計(jì)算窗口內(nèi)的行數(shù)。

語(yǔ)法

COUNT(*) OVER (
    [PARTITION BY 分區(qū)列1, 分區(qū)列2, ...]
    [ORDER BY 排序列1 [ASC|DESC], 排序列2 [ASC|DESC], ...]
    [ROWS | RANGE BETWEEN 邊界1 AND 邊界2]
)

示例

-- 每個(gè)產(chǎn)品的訂單數(shù)量
SELECT 
    Product,
    COUNT(*) OVER (PARTITION BY Product) AS ProductOrderCount
FROM Sales;

使用場(chǎng)景

  • 分組統(tǒng)計(jì)
  • 數(shù)據(jù)驗(yàn)證
  • 頻率分析

9. LEAD()

函數(shù)說(shuō)明:訪問(wèn)當(dāng)前行后n行的值。如果超出范圍,返回默認(rèn)值。

語(yǔ)法

LEAD(列, n, 默認(rèn)值) OVER (
    [PARTITION BY 分區(qū)列1, 分區(qū)列2, ...]
    ORDER BY 排序列1 [ASC|DESC], 排序列2 [ASC|DESC], ...
)

參數(shù)說(shuō)明

  • :要訪問(wèn)的列
  • n:向后偏移的行數(shù)(默認(rèn)為1)
  • 默認(rèn)值:當(dāng)超出范圍時(shí)返回的值(默認(rèn)為NULL)

示例

-- 計(jì)算價(jià)格變化
SELECT 
    OrderDate,
    Price,
    LEAD(Price, 1, 0) OVER (ORDER BY OrderDate) AS NextPrice,
    Price - LEAD(Price, 1, 0) OVER (ORDER BY OrderDate) AS PriceChange
FROM Sales;

使用場(chǎng)景

  • 時(shí)間序列分析
  • 增長(zhǎng)率計(jì)算
  • 趨勢(shì)預(yù)測(cè)

10. LAG()

函數(shù)說(shuō)明:訪問(wèn)當(dāng)前行前n行的值。如果超出范圍,返回默認(rèn)值。

語(yǔ)法

LAG(列, n, 默認(rèn)值) OVER (
    [PARTITION BY 分區(qū)列1, 分區(qū)列2, ...]
    ORDER BY 排序列1 [ASC|DESC], 排序列2 [ASC|DESC], ...
)

示例

-- 計(jì)算環(huán)比增長(zhǎng)率
SELECT 
    OrderDate,
    Price,
    LAG(Price, 1, Price) OVER (ORDER BY OrderDate) AS PrevPrice,
    (Price - LAG(Price, 1, Price) OVER (ORDER BY OrderDate)) / 
    LAG(Price, 1, Price) OVER (ORDER BY OrderDate) * 100 AS GrowthRate
FROM Sales;

使用場(chǎng)景

  • 環(huán)比分析
  • 歷史比較
  • 變化率計(jì)算

11. FIRST_VALUE()

函數(shù)說(shuō)明:返回窗口幀中第一個(gè)值。

語(yǔ)法

FIRST_VALUE(列) OVER (
    [PARTITION BY 分區(qū)列1, 分區(qū)列2, ...]
    ORDER BY 排序列1 [ASC|DESC], 排序列2 [ASC|DESC], ...
    [ROWS | RANGE BETWEEN 邊界1 AND 邊界2]
)

示例

-- 每個(gè)產(chǎn)品的首次銷售價(jià)格
SELECT 
    Product,
    OrderDate,
    Price,
    FIRST_VALUE(Price) OVER (PARTITION BY Product ORDER BY OrderDate) AS FirstPrice
FROM Sales;

使用場(chǎng)景

  • 基準(zhǔn)值比較
  • 初始狀態(tài)記錄
  • 歷史對(duì)比

12. LAST_VALUE()

函數(shù)說(shuō)明:返回窗口幀中最后一個(gè)值。注意:默認(rèn)窗口幀到當(dāng)前行,通常需要調(diào)整。

語(yǔ)法

LAST_VALUE(列) OVER (
    [PARTITION BY 分區(qū)列1, 分區(qū)列2, ...]
    ORDER BY 排序列1 [ASC|DESC], 排序列2 [ASC|DESC], ...
    [ROWS | RANGE BETWEEN 邊界1 AND 邊界2]
)

示例

-- 每個(gè)產(chǎn)品的最新價(jià)格(需要調(diào)整窗口幀)
SELECT 
    Product,
    OrderDate,
    Price,
    LAST_VALUE(Price) OVER (
        PARTITION BY Product 
        ORDER BY OrderDate 
        ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
    ) AS LastPrice
FROM Sales;

使用場(chǎng)景

  • 最新?tīng)顟B(tài)獲取
  • 最終值比較
  • 狀態(tài)跟蹤

13. PERCENT_RANK()

函數(shù)說(shuō)明:計(jì)算相對(duì)排名,返回0到1之間的值。第一名的值為0,最后一名的值為1。

語(yǔ)法

PERCENT_RANK() OVER (
    [PARTITION BY 分區(qū)列1, 分區(qū)列2, ...]
    ORDER BY 排序列1 [ASC|DESC], 排序列2 [ASC|DESC], ...
)

示例

-- 價(jià)格百分位排名
SELECT 
    Product,
    Price,
    PERCENT_RANK() OVER (ORDER BY Price DESC) AS PricePercentRank
FROM Sales;

使用場(chǎng)景

  • 統(tǒng)計(jì)分布分析
  • 百分位計(jì)算
  • 數(shù)據(jù)標(biāo)準(zhǔn)化

14. CUME_DIST()

函數(shù)說(shuō)明:計(jì)算累計(jì)分布,返回0到1之間的值。表示小于等于當(dāng)前值的行數(shù)占總行數(shù)的比例。

語(yǔ)法

CUME_DIST() OVER (
    [PARTITION BY 分區(qū)列1, 分區(qū)列2, ...]
    ORDER BY 排序列1 [ASC|DESC], 排序列2 [ASC|DESC], ...
)

示例

-- 價(jià)格累計(jì)分布
SELECT 
    Product,
    Price,
    CUME_DIST() OVER (ORDER BY Price) AS PriceCumeDist
FROM Sales;

使用場(chǎng)景

  • 分布分析
  • 分位數(shù)計(jì)算
  • 數(shù)據(jù)分布可視化

15. PERCENTILE_CONT()

函數(shù)說(shuō)明:計(jì)算連續(xù)百分位數(shù),返回插值后的值。

語(yǔ)法

PERCENTILE_CONT(百分位數(shù)) OVER (
    [PARTITION BY 分區(qū)列1, 分區(qū)列2, ...]
    ORDER BY 排序列1 [ASC|DESC], 排序列2 [ASC|DESC], ...
)

示例

-- 計(jì)算中位數(shù)(50%分位數(shù))
SELECT 
    Product,
    PERCENTILE_CONT(0.5) OVER (PARTITION BY Product ORDER BY Price) AS MedianPrice
FROM Sales;

使用場(chǎng)景

  • 統(tǒng)計(jì)分位數(shù)
  • 數(shù)據(jù)分布分析
  • 異常值檢測(cè)

16. PERCENTILE_DISC()

函數(shù)說(shuō)明:計(jì)算離散百分位數(shù),返回實(shí)際存在的值。

語(yǔ)法

PERCENTILE_DISC(百分位數(shù)) OVER (
    [PARTITION BY 分區(qū)列1, 分區(qū)列2, ...]
    ORDER BY 排序列1 [ASC|DESC], 排序列2 [ASC|DESC], ...
)

示例

-- 計(jì)算離散中位數(shù)
SELECT 
    Product,
    PERCENTILE_DISC(0.5) OVER (PARTITION BY Product ORDER BY Price) AS DiscreteMedian
FROM Sales;

使用場(chǎng)景

  • 離散分位數(shù)
  • 實(shí)際值分析
  • 數(shù)據(jù)驗(yàn)證

排名函數(shù)

排名函數(shù)用于為行分配排名或分組。

1. ROW_NUMBER()

用法:為每個(gè)分區(qū)內(nèi)的行分配一個(gè)唯一的連續(xù)整數(shù),從1開(kāi)始,按照 ORDER BY 排序。

語(yǔ)法

ROW_NUMBER() OVER (PARTITION BY 分區(qū)列 ORDER BY 排序列)

例子

SELECT 
    Product, 
    Quantity, 
    ROW_NUMBER() OVER (PARTITION BY Product ORDER BY Quantity DESC) AS RowNum
FROM Sales;

結(jié)果(假設(shè)數(shù)據(jù)):

  • A, 15, 1
  • A, 10, 2
  • B, 20, 1

使用場(chǎng)景:分頁(yè)查詢、生成唯一行號(hào)、刪除重復(fù)記錄(結(jié)合 CTE)。

2. RANK()

用法:為行分配排名,如果值相同則排名相同,下一個(gè)排名會(huì)跳過(guò)(有間隙)。

語(yǔ)法

RANK() OVER (PARTITION BY 分區(qū)列 ORDER BY 排序列)

例子

SELECT 
    Product, 
    Quantity, 
    RANK() OVER (ORDER BY Quantity DESC) AS Rank
FROM Sales;

結(jié)果

  • B, 20, 1
  • A, 15, 2
  • A, 10, 3 (沒(méi)有跳躍,因?yàn)闆](méi)有并列)

如果有兩個(gè)15,則:15排2,下一個(gè)跳到4。

使用場(chǎng)景:排名競(jìng)賽、識(shí)別前N名,但允許并列。

3. DENSE_RANK()

用法:類似于 RANK,但排名連續(xù),沒(méi)有間隙。

語(yǔ)法

DENSE_RANK() OVER (PARTITION BY 分區(qū)列 ORDER BY 排序列)

例子:同上,如果有兩個(gè)15,則:15排2,下一個(gè)排3。

使用場(chǎng)景:需要連續(xù)排名的場(chǎng)景,如獎(jiǎng)牌排名(金銀銅連續(xù))。

4. NTILE(n)

用法:將分區(qū)內(nèi)的行分成 n 個(gè)組,每組分配一個(gè)從1到n的數(shù)字。

語(yǔ)法

NTILE(組數(shù)) OVER (PARTITION BY 分區(qū)列 ORDER BY 排序列)

例子

SELECT 
    Product, 
    Quantity, 
    NTILE(2) OVER (ORDER BY Quantity DESC) AS Tile
FROM Sales;

結(jié)果:分成兩組,前半組1,后半組2。

使用場(chǎng)景:分桶分析、將數(shù)據(jù)分成等份(如分位數(shù))。

聚合函數(shù)

聚合函數(shù)如 SUM、AVG、MIN、MAX、COUNT 可以與 OVER 結(jié)合,在窗口內(nèi)計(jì)算。

1. SUM()

用法:計(jì)算窗口內(nèi)列的總和。

語(yǔ)法

SUM(列) OVER (PARTITION BY 分區(qū)列 ORDER BY 排序列 ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)

例子(累計(jì)銷售):

SELECT 
    OrderDate, 
    Price, 
    SUM(Price) OVER (ORDER BY OrderDate) AS RunningTotal
FROM Sales;

結(jié)果:每行顯示到當(dāng)前日期的累計(jì)總價(jià)。

使用場(chǎng)景:運(yùn)行總計(jì)、累計(jì)求和、財(cái)務(wù)報(bào)告。

2. AVG()

用法:計(jì)算平均值。

語(yǔ)法:類似 SUM。

例子:計(jì)算移動(dòng)平均。

使用場(chǎng)景:趨勢(shì)分析、股票移動(dòng)平均。

3. MIN() / MAX()

用法:窗口內(nèi)最小/最大值。

例子:查找每個(gè)產(chǎn)品的歷史最低價(jià)。

使用場(chǎng)景:價(jià)格監(jiān)控、極值分析。

4. COUNT()

用法:計(jì)數(shù)。

例子:計(jì)算每個(gè)分區(qū)內(nèi)的行數(shù)。

使用場(chǎng)景:分組計(jì)數(shù)而不使用 GROUP BY。

分析函數(shù)

分析函數(shù)用于訪問(wèn)窗口中其他行的數(shù)據(jù)。

1. LEAD(列, n, 默認(rèn)值)

用法:返回當(dāng)前行后 n 行的列值。

語(yǔ)法

LEAD(列, n, 默認(rèn)值) OVER (PARTITION BY 分區(qū)列 ORDER BY 排序列)

例子

SELECT 
    OrderDate, 
    Price, 
    LEAD(Price, 1, 0) OVER (ORDER BY OrderDate) AS NextPrice
FROM Sales;

結(jié)果:顯示下一訂單的價(jià)格。

使用場(chǎng)景:比較前后行、計(jì)算增長(zhǎng)率、時(shí)間序列分析。

2. LAG(列, n, 默認(rèn)值)

用法:返回當(dāng)前行前 n 行的列值。

語(yǔ)法:類似 LEAD。

例子:計(jì)算價(jià)格變化。

使用場(chǎng)景:與 LEAD 類似,用于歷史比較。

3. FIRST_VALUE(列)

用法:返回窗口幀中第一個(gè)值。

語(yǔ)法

FIRST_VALUE(列) OVER (PARTITION BY 分區(qū)列 ORDER BY 排序列 ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)

例子:每個(gè)產(chǎn)品的首次銷售價(jià)格。

使用場(chǎng)景:基準(zhǔn)值比較。

4. LAST_VALUE(列)

用法:返回窗口幀中最后一個(gè)值。注意:默認(rèn)幀到當(dāng)前行,需要調(diào)整。

例子:每個(gè)產(chǎn)品的最新價(jià)格。

使用場(chǎng)景:最新?tīng)顟B(tài)獲取。

其他函數(shù)

1. PERCENT_RANK()

用法:計(jì)算相對(duì)排名(0到1)。

語(yǔ)法:OVER (ORDER BY 排序列)

例子:百分位排名。

使用場(chǎng)景:統(tǒng)計(jì)分布。

2. CUME_DIST()

用法:累計(jì)分布(0到1)。

使用場(chǎng)景:分布分析。

結(jié)論

SQL Server 窗口函數(shù)極大地簡(jiǎn)化了復(fù)雜查詢,提高了效率。通過(guò)掌握這些函數(shù),你可以處理各種數(shù)據(jù)分析任務(wù)。建議在實(shí)際項(xiàng)目中練習(xí),以加深理解。注意:窗口函數(shù)不支持在 WHERE 或 GROUP BY 中使用,通常在 SELECT 或 ORDER BY 中。

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

相關(guān)文章

最新評(píng)論

加查县| 芮城县| 耒阳市| 汝阳县| 文登市| 漠河县| 噶尔县| 老河口市| 峨眉山市| 望江县| 上杭县| 墨竹工卡县| 永嘉县| 日照市| 都兰县| 监利县| 宜州市| 册亨县| 马龙县| 龙井市| 冕宁县| 竹北市| 勃利县| 建宁县| 津市市| 开平市| 雅安市| 金昌市| 溆浦县| 南昌县| 长泰县| 和顺县| 天峻县| 大理市| 凤庆县| 八宿县| 廉江市| 双江| 贵定县| 全州县| 缙云县|