试图理解over()和partition by

Luk*_*101 23 sql oracle

我试图通过缠绕在我头上的功能进行分区.这是一个我不明白的例子.

这是我的数据:

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
Run Code Online (Sandbox Code Playgroud)

当我运行此查询时:

select Row_Number() over(partition by orderdate order by orderdate asc) 
    as Rownumber, salesorderid, orderdate
from test2
order by rownumber
Run Code Online (Sandbox Code Playgroud)

以下是我得到的结果:

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 
Run Code Online (Sandbox Code Playgroud)

有人可以向我解释这个问题.我并不是SQL的新手,但是我一直在苦苦挣扎,并且不能让我的头脑缠身.

Chi*_*Chi 35

尝试按订单日期订购,您将更容易看到结果

select Row_Number() over(partition by orderdate order by orderdate asc) 
    as Rownumber, salesorderid, orderdate
from test2
order by orderdate;
Run Code Online (Sandbox Code Playgroud)

应该给(为了清楚起见我添加了空白行)

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
Run Code Online (Sandbox Code Playgroud)

您会注意到结果被划分为"分区",每个分区都是具有相同顺序的行集.这就是"按顺序分区"的意思.

在分区内,行按orderdate排序,按照'(按orderdate order by orderdate asc)的第二个子句'排序.这不是很有用,因为分区中的所有行都将具有相同的orderdate.因此,分区内行的排序是随机的.尝试使用partition by子句中的salesorderid进行排序,以获得更可重现的结果.

row_number()只返回每个分区中行的排序


rua*_*akh 12

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()是任意的:每一行都会有不同的号码,但没有保证哪行会有哪个号码.