幾乎每次我展示sql server裡的視窗時,人們都非常有興趣知道,當你定義你的視窗(指定的一組行)時,rows
與range
選項之間的區別。因此在今天的文章裡我想給你展示下這些選項的區別,對於你的分析計算意味著什麼。
當你用over()
子句進行你的分析計算來開啟你的視窗,你也可以在視窗裡看到的,通過rows
與range
選項來限制你的行數。來看下面的t-sql語句:
1這個t-sql語句用sum()聚合函式進行彙總計算。視窗本身從第1行(select
2t.orderyear,
3t.ordermonth,
4t.totaldue,
5sum(t.totaldue) over(order
by t.orderyear, t.ordermonth rows between unbounded preceding and
current row) as
'runningtotal'6
from7(
8select
9year(orderdate) as
'orderyear',
10month(orderdate) as
'ordermonth',
11salespersonid,
12totaldue
13from
sales.salesorderheader
14 ) ast15
where
16 t.salespersonid =
274
17and t.orderyear =
2005
18go
unbounded preceding
)上至當前行(
current row
)。對於記錄級中的每1行,視窗變得越來越大,因此很容易進行彙總運算。下圖演示了這個概念。
從輸出你可以看到,結果是個自增長的彙總——執行合計彙總的結果。
現在假設你修改視窗為range between unbounded preceding and current row
,會發生什麼:
1從下圖你可以看到,你得到了不同的結果,對於2023年11月的記錄顯示同樣的彙總。select
2t.orderyear,
3t.ordermonth,
4t.totaldue,
5sum(t.totaldue) over(order
by t.orderyear, t.ordermonth range between unbounded preceding and
current row) as
'runningtotal'6
from7(
8select
9year(orderdate) as
'orderyear',
10month(orderdate) as
'ordermonth',
11salespersonid,
12totaldue
13from
sales.salesorderheader
14 ) ast15
where
16 t.salespersonid =
274
17and t.orderyear =
2005
18go
我們來嘗試理解下為什麼這裡range
選項比rows
選項給你不同的結果。使用rows
選項你定義當前行的固定前後記錄。這裡你看到的行取決於視窗的order by
從句。你也可以說你在物理級別定義你的視窗。
當你使用range
選項事情就改變了。range
選項包含視窗裡的所有行,和當前行有相同order by
值。從剛才的你可以看到,對於2023年11月的2條記錄你拿到同個彙總,因為這2行有同樣的order by
值(2023年11月)。使用range
選項你在邏輯級別定義你的視窗。如果更多的行有同個order by
值,當你使用rows
選項你的視窗會包含更多的行。
在今天的文章裡你看到了當你為你的分析計算定義視窗時,rows和range選項之間的區別。使用rows選項你在物理級別定義在你視窗裡有多少行。使用range選項取決於order by值在視窗裡有多少行被包含。因此當你使用range選項時有效能上的巨大區別。在接下來的文章我會討論下這些***。
sqlServer 視窗函式
1 視窗函式的作用於由over子句定義的資料行集合 2 視窗函式主要用於分析目的 彙總計算 移動平均值計算 計算資料差 發現資料島等 3 這些函式都是基於標準sql iso 和 ansi 標準 4 其概念的精髓在於可以通過對資料行集合或資料行視窗進行多種計算,最後得到單個值 5 視窗函式讓我們以更加...
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...