Sql-Server
為什麼更改視窗函式“MAX() OVER()”的 ORDER BY 部分中的列會影響最終結果?
我有一個具有以下結構的表,它是數據:
create table test_table ( Item_index int, Item_name varchar(50) ) insert into test_table (Item_index,Item_name) values (0,'A') insert into test_table (Item_index,Item_name) values (1,'B') insert into test_table (Item_index,Item_name) values (0,'C') insert into test_table (Item_index,Item_name) values (1,'D') insert into test_table (Item_index,Item_name) values (0,'E')
我想知道為什麼更改
order by
查詢部分中的列會更改結果?在QUERY-1
, 我使用item_index
和 在QUERY-2
I useditem_name
列中按部分順序排列。我認為這兩個查詢必須生成相同的結果because I used
item_indexin both queries for partitioning!
我現在完全糊塗了!為什麼按列排序會影響最終結果?QUERY-1:
select t.*, max(t.Item_name)over(partition by t.item_index order by item_index) new_column from test_table t;
結果:
Item_index Item_name new_column ----------- -------------------------- 0 A E 0 C E 0 E E 1 D D 1 B D
查詢 2:
select t.*, max(t.Item_name)over(partition by t.item_index order by item_name) new_column from test_table t;
結果:
Item_index Item_name new_column ----------- ----------------------- 0 A A 0 C C 0 E E 1 B B 1 D D
誰能解釋這兩個查詢是如何執行的以及為什麼每個查詢都會產生不同的結果?
提前致謝
max(t.Item_name)over(partition by t.item_index order by item_index) new_column
讓我們取一個
t.item_index
= 0 的組。它是應用時
order by item_index
,所有行都具有相同的值,因此所有行都包含在框架中,並且所有行值都用於 MAX() 選擇。所以'E'
返回所有行的值。
max(t.Item_name)over(partition by t.item_index order by item_name)
讓我們採取同一組。
現在排序鍵不同了,當
RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
應用視窗時,不同的行被包含到要調查的框架中。對於第一行,只有這一行包含在框架中,並且
'A'
是框架中的唯一值,所以它被返回。對於第 2 行,前 2 行包含在幀中,值
'A'
和'C'
進行比較,並'C'
作為幀中的最大值返回。對於第 3 行,所有 3 行都包含在框架中,值
'A'
和'C'
進行'E'
比較,並'E'
作為框架中的最大值返回。