gpt4 book ai didi

sql - 试图理解 over() 和 partition by

转载 作者:行者123 更新时间:2023-12-03 11:08:31 26 4
gpt4 key购买 nike

我试图通过围绕在我头上的功能来解决和分区。这是一个我只是不明白的例子。

这是我拥有的数据:

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 并不陌生,但我一直在努力解决窗口问题,无法解决这个问题。

最佳答案

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

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 排序,根据“(partition by orderdate order by orderdate asc)”的第二个子句。这不是很有用,因为分区中的所有行都将具有相同的 orderdate。因此,分区内行的顺序是随机的。尝试在 partition by 子句中按 salesorderid 排序以获得更可重现的结果。

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

关于sql - 试图理解 over() 和 partition by,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9315070/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com