2012-02-16 63 views
20

我試圖通過包裹在我頭上的功能來獲得結束和分區。這是一個我只是不明白的例子。試圖瞭解over()和分區

這裏是我擁有的數據:

SALESORDERID  ORDERDATE 
43894    08/01/2001 
43664    07/01/2001 
43911    08/01/2001 
43867    08/01/2001 
43877    08/01/2001 
44285    10/01/2001 
44501    11/01/2001 
43866    08/01/2001 
43895    08/01/2001 
43860    08/01/2001 

當我運行此查詢:

select Row_Number() over(partition by orderdate order by orderdate asc) 
    as Rownumber, salesorderid, orderdate 
from test2 
order by rownumber 

下面是結果我得到:

ROWNUMBER  SALESORDERID  ORDERDATE 
1    43664    07/01/2001 
1    43911    08/01/2001 
1    44109    09/01/2001 
1    44483    11/01/2001 
1    44285    10/01/2001 
2    43867    08/01/2001 
2    44501    11/01/2001 
3    43895    08/01/2001 
4    43894    08/01/2001 
5    43877    08/01/2001 

有人能解釋一下這個查詢對我來說。我對SQL不是陌生的,但是我一直在努力尋找窗口,並且無法讓我的頭部纏繞在這裏。

回答

26

嘗試排序,你會看到的結果更容易

select Row_Number() over(partition by orderdate order by orderdate asc) 
    as Rownumber, salesorderid, orderdate 
from test2 
order by orderdate; 

應該給(我已經添加了清晰的空行)

ROWNUMBER  SALESORDERID  ORDERDATE 
1    43664    07/01/2001 

1    43911    08/01/2001 
2    43867    08/01/2001 
3    43895    08/01/2001 
4    43894    08/01/2001 
5    43877    08/01/2001 

1    44109    09/01/2001 

1    44285    10/01/2001 

1    44483    11/01/2001 
2    44501    11/01/2001 

你會發現,結果被分成'分區',每個分區是具有相同命令的一組行。這就是「按訂單分區」的意思。

在一個分區內,行按orderdate排序,按照'(by order order order by orderdate asc)分區的第二個子句''。這不是非常有用,因爲分區內的所有行將具有相同的orderdate。因此,分區內的行的排序是隨機的。嘗試按照partition by子句中的salesorderid進行排序,以獲得更加可重現的結果。

ROW_NUMBER()只是返回每個分區

+1

也可以嘗試SELECT COUNT(*)OVER(分區....)中的行的順序可能是更清楚你它在做什麼。 – 2012-02-16 16:42:32

+0

謝謝你的回答。分區子句非常強大 – Luke101 2012-02-17 16:13:07

+0

非常感謝! – 2014-08-27 17:50:48

9

partition by orderdate表示您只是將記錄與具有相同orderdate的其他記錄進行比較。例如,在orderdate = '08/01/2001'的五條記錄中,一條將具有row_number() = 1,一條將具有row_number() = 2,依此類推。

order by orderdate asc意味着在一個分區內,行號將按照orderdate的順序分配。在你的例子中沒有任何效果,因爲你已經分區了orderdate,所以分區中的所有記錄將具有相同的orderdate。 (這就像寫作SELECT ... FROM t WHERE c = 6 ORDER BY c:所有選定的記錄具有相同的值c,因此ORDER BY c什麼都不做)。因此,在一個分區內,row_number()的賦值是任意的:每行都有不同的數字,但是沒有保證哪一行有哪個號碼。通過訂單日期

+0

這個答案應該被接受,而不是 – Avi 2016-12-11 22:28:51