Sql-Server

為什麼更改視窗函式“MAX() OVER()”的 ORDER BY 部分中的列會影響最終結果?

  • April 20, 2021

我有一個具有以下結構的表,它是數據:

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-2I useditem_name列中按部分順序排列。我認為這兩個查詢必須生成相同的結果because I used item_index in 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'作為框架中的最大值返回。

引用自:https://dba.stackexchange.com/questions/290034