sqlServer 視窗函式

2022-08-26 05:12:08 字數 3318 閱讀 3832

(1)視窗函式的作用於由over子句定義的資料行集合

(2)視窗函式主要用於分析目的、彙總計算、移動平均值計算、計算資料差、發現資料島等

(3)這些函式都是基於標準sql(iso 和 ansi 標準)

(4)其概念的精髓在於可以通過對資料行集合或資料行視窗進行多種計算,最後得到單個值

(5)視窗函式讓我們以更加輕鬆、直觀、高效的方式解決資料行集合計算和分析問題

(6)視窗函式是sql 查詢的未來方向,值得學習

2.1視窗函式的描述

(1)視窗函式作用於乙個資料行集合。視窗是標準sql術語,用來描述sql語句中用over子句劃定的內容,這個內容就是視窗函式的作用域

(2)對於結果集的每一行,over子句都定義乙個與之對應的獨立視窗

--

使用rank函式、更具val降序排序,並輸出排名

select

orderid, orderdate, val,

rank()

over(order

by val desc) as

rnkfrom

sales.ordervalues

order

by rnk;

(3)標準sql第一次支援視窗函式是在sql:1999的拓展文件,此時稱為「olap」,最新的sql 標準中已經有了非常豐富和全面的視窗函式了

(4)標準sql支援幾種視窗函式型別: 集合、排序 、分布、 偏移

(5)聚集視窗函式就是常用的sum、count 、min 、max 等函式,乙個聚集函式的作用域就是乙個記錄集 、這個記錄集由查詢分組、或視窗描述來定義

(6)排名函式有rank 、dense_rank、 row_number、 ntile ,sql 標準中將前兩個和後兩個歸於不同型別

(7)分布函式有percent_rank、cume_dist、percentile_count 、percentile_disc ,這四個函式從sql server 2012 開始引入

(8)視窗函式的具體應用: 分頁、去重、返回前n條資料、計算累積合計、對時間間隔進行操作、統計最大併發會話數、找出資料差距(gap)、找資料島(island)、計算百分比、計算分布模式、排序層次結構、資料透視、計算時效性、計算近因

視窗函式的行為描述出現在over子句中,涉及3個元素、分割槽、排序、框架

(1)分割槽元素使得將我們的視窗範圍限制為只與當前行的分割槽特性(分割槽列)值相等的行集

(2)理解分割槽,要理解分割槽的過濾、賽選 視窗行集

(1)排序元素定義計算的順序,且定義的是分區內的順序

(2)sql server 對聚合函式中排序的支援是從sqlserver2012開始的

(1) 從本質上來說,框架是乙個在分區內對行進一步限制的賽選器

(2) 框架是在視窗使用partition 過濾,然後使用order by 排序之後,進一步限制範圍

(3)sql server 2012開始支援框架

(4)框架限制格式略,其實是指定上下界,上下界通過當前行的偏移量來指定

並不是所有的查詢子句都支援視窗函式、只有select 和 orderby子句支援,這是為了避免二義性(「同時執行的原因,導致結果不確定」),把查詢結果(幾乎是)當成視窗的起點

(1)視窗聚合函式和分組聚合函式的功能是相同的,乙個聚合函式作用於乙個行集上,使用什麼語言機制來定義不重要

(2)在標準sql 中聚合視窗函式支援三種元素,分割槽、排序、框架,這三種元素的目的都是對視窗內的行進行過濾

(3)當不對視窗進行任何限制的時候,即over子句後面的括號為空,select 的結果集 直接 作為視窗函式的輸入

檢視乙個例子,體驗聚合函式作用的視窗使用與沒有使用分割槽過濾過濾的區別

--

default and explicit partitioning

usetsql2012;

select

orderid, custid, val,

sum(val) over() as

sumall,

sum(val) over(partition by custid) as

sumcust

from sales.ordervalues as

o1;/*

orderid custid val sumall sumcust

-------- ------- ------- ----------- --------

10643 1 814.50 1265793.22 4273.00

10692 1 878.00 1265793.22 4273.00

10702 1 330.00 1265793.22 4273.00

10835 1 845.80 1265793.22 4273.00

10952 1 471.20 1265793.22 4273.00

11011 1 933.50 1265793.22 4273.00

10926 2 514.40 1265793.22 1402.95

10759 2 320.00 1265793.22 1402.95

10625 2 479.75 1265793.22 1402.95

10308 2 88.80 1265793.22 1402.95

...*/

(1)row_number()根據over子句中order by 排序結果,分配連續遞增整數

(2)order by 排序元素值相等的兩列,即使值沒有增加,row_number()也增加、即row_number()必須生成唯一值、即使排序值有相等情況

(1) rank 是在分割槽範圍內比較排序值的大小,返回 大於或小於當前排序值的記錄個數+1

(2)根據上訴邏輯,當不同記錄擁有相同的邏輯排序值,那麼rank 返回的排名值相等,這與row_number 相等

(1)dense_rank() 處理邏輯類似rank,都是比較值,取個數,因此當排序值相等,排名值也相等

(2)dense_rank 與rank 的區別是,在計算個數的時候,rank 不去重,dense_rank ,會去重

(1)ntile 函式允許將結果中的行與大小相等的行組關聯起來

(2)將分割槽分成多少個組,在函式輸入總指定,如ntile(10),分成10個組

(3)返回row_number排序,分組之後的組號

這個就是找當前行偏移指定行的數的值,用的少

(1)支撐 分割槽、 排序 、框架

(2)和普通聚合函式沒有區別,常規聚合作用了分組、開窗聚合聚合於視窗

SQL Server視窗函式 ROWS與RANGE

幾乎每次我展示sql server裡的視窗時,人們都非常有興趣知道,當你定義你的視窗 指定的一組行 時,rows 與range 選項之間的區別。因此在今天的文章裡我想給你展示下這些選項的區別,對於你的分析計算意味著什麼。當你用over 子句進行你的分析計算來開啟你的視窗,你也可以在視窗裡看到的,通過...

SqlServer三種常用視窗函式

插入資料 1 insert into t score values 1,76 2,87 3,60 5,92 6,88 7,71 8,92 rank over,跳躍排序,允許並列,並在發生並列時保留名次空缺。1 select rank over order by score desc 排名 dense...

SQL SERVER 2008排序函式 視窗函式

排序函式可以用來協助給結果集增加位置資訊。sql server 2008只有四個排序函式,介紹如下 row number 返回結果集中給定行的序號 rank 基於給定行集合的選擇順序,給出行的位置。如有一些值連在一起,位置間有空隙 如兩個值在第一位,然後下乙個值將在第三位 dense rank 同r...