我试图通过缠绕在我头上的功能进行分区.这是一个我不明白的例子.
这是我的数据:
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()是任意的:每一行都会有不同的号码,但没有保证哪行会有哪个号码.
| 归档时间: |
|
| 查看次数: |
26064 次 |
| 最近记录: |