回答

收藏

试图了解over()和分区

技术问答 技术问答 203 人阅读 | 0 人回复 | 2023-09-14

我试图通过包裹在我头上的功能来解决问题。这是一个我不明白的例子。
/ u( M. V& i5 D: F6 U3 G这是我的数据:3 D3 P7 [/ s1 P& q4 \* q* r6 }
SALESORDERID       ORDERDATE                                                 07/01/2001/20014386711                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 运行此查询时:
; S& L0 z5 Y8 E: bselect Row_Number() over(partition by orderdate order by orderdate asc)     as Rownumber,salesorderid,orderdatefrom test2order by rownumber这是我的结果:. ]+ ]8 V+ R( l" I* b
ROWNUMBER     SALESORDERID       ORDERDATE                      807/01/20001/20001111                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             有人可以向我解释这个查询。SQL并不陌生,但我一直在挣扎的窗口工作,无法解决这个问题。8 Y' Q* b& \- B$ i5 Y
                                                               
: g1 Y5 ~) ~2 J' N& D/ J    解决方案:                                                               
# ~9 \# [. X# ^7 t. ?- e                                                                试着按照订单日期订购,你会更容易看到结果. R. b, [9 a- i( ~
select Row_Number() over(partition by orderdate order by orderdate asc)     as Rownumber,salesorderid,orderdatefrom test2order by orderdate;应该给(为了明确起见,我加了空行)
3 C. I' Y1 E, s+ LROWNUMBER     SALESORDERID       ORDERDATE                        507/01/20011111111                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              你会注意到结果被划分为分区,每个分区都是有相同订单日期的线路的集合。这意味着按订单日期划分。# v/ z2 d6 S* j8 n5 l: Q
在分区内,行按orderdate排序,如(按orderdate排序,按orderdate: |0 v# K7 x7 H% ^3 b$ d+ H6 R
asc第二句所示的排序)。这不是很有用,因为分区中的所有行都会有相同的orderdate。因此,分区中行的顺序是随机的。尝试在partition2 F- V' b( i" B/ \
by子句中按salesorderid为了获得更重复的结果,排序。
5 W* i: k+ m1 B" F# ]; qrow_number()只返回每个分区的顺序
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则