程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> 關於SqlServer >> SQL Server Window Function窗體函數之SQL Windowing

SQL Server Window Function窗體函數之SQL Windowing

編輯:關於SqlServer

SQL Server 窗體函數主要用來處理由 OVER 子句定義的行集, 主要用來分析和處理

Running totals

Moving averages

Gaps and islands

先看一個簡單的應用 - 按照訂單額從高到低對訂單表信息做一個排名

USE TSQL2012
GO
    
SELECT orderid,
       orderdate,
       val,
       RANK() OVER(ORDER BY val DESC) AS rnk
FROM Sales.OrderValues
ORDER BY rnk

查詢結果 -

OrderID OrderDate             Val    Rnk

10865    2008-02-02 00:00:00.000    16387.50    1

10981    2008-03-27 00:00:00.000    15810.00    2

11030    2008-04-17 00:00:00.000    12615.05    3

10889    2008-02-16 00:00:00.000    11380.00    4

10417    2007-01-16 00:00:00.000    11188.40    5

10817    2008-01-06 00:00:00.000    10952.85    6

10897    2008-02-19 00:00:00.000    10835.24    7

10479    2007-03-19 00:00:00.000    10495.60    8

OVER 的作用

OVER 的作用就是定義了行集窗體,這個窗體的集合為當前行提供了一個上下文環境. RANK 函數根 據指定的集合以及行集的排序順序計算出當前行的排名, 以 Rnk = 5 為例, 排序後這條數據的前面有 4條數據,所以它的排名就是 4 + 1 = 5

再總結簡單一點就是, OVER 定義了一個行的集合, 它是一個函數, 每次向當前行返回一個唯一的 值, 如何返回? 在這個例子中就使用 RANK 函數返回了當前行的一個排名.

與OVER搭配使用的其它函數

聚合的函數 - SUM, COUNT, MIN, MAX

排名的函數 - RANK, DENSE_RANK, ROW_NUMBER, NTILE

Distribution 函數 - PERCENT_RANK, CUME_DIST, PERCENTILE_CONT, PERCENTILE_DISC

Offset 函數  - LAG, LEAD, FIRST_VALUE, LAST_VALUE

SQL Server Window Function 的應用

窗體函數的應用非常廣泛 - 像分頁,去重,分組的基礎上返回 Top N 的行, 計算 Running Totals,Gaps and islands, 百分率, Hierarchy 排序, Pivoting 等等

使用 Windows 窗體函數的原因一方面是因為 SQL Server 的優化器不夠完美, 盡管足夠強大, 但 是並不會涵蓋所有的優化規則.

第二, 在執行計劃的選擇上,SQL Server 並不會真正執行所有有可能的計劃來獲取一個最優的選 擇,對於 SQL 本身這種指令性語言的解析和優化優化器只能說是在最短時間裡盡量做到足夠好,選擇 一個好的執行計劃. 而 Window 窗體函數本身就經歷過了很好的調優處理, 所以性能會更加好一 些.

  1. 上一頁:
  2. 下一頁: