回答

收藏

试图了解over()和分区

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

我试图通过包裹在我头上的功能来解决问题。这是一个我不明白的例子。* x& s0 J7 k! `; S9 O
这是我的数据:
: n/ V" \/ e& o& Z  O$ ZSALESORDERID       ORDERDATE                                                 07/01/2001/20014386711                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 运行此查询时:
% _5 u+ b$ `* h+ cselect Row_Number() over(partition by orderdate order by orderdate asc)     as Rownumber,salesorderid,orderdatefrom test2order by rownumber这是我的结果:+ Z+ g8 J, F, G7 d7 T# D8 N
ROWNUMBER     SALESORDERID       ORDERDATE                      807/01/20001/20001111                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             有人可以向我解释这个查询。SQL并不陌生,但我一直在挣扎的窗口工作,无法解决这个问题。
: _, e( K/ l; d( P; `0 U5 u; g* `                                                                , {& Z# I) C+ U- Z
    解决方案:                                                               
9 I4 W( C3 J( |                                                                试着按照订单日期订购,你会更容易看到结果
& P/ H7 D4 P2 Y$ Vselect Row_Number() over(partition by orderdate order by orderdate asc)     as Rownumber,salesorderid,orderdatefrom test2order by orderdate;应该给(为了明确起见,我加了空行)( a' B- U- o* P5 D  {8 d3 ~. |
ROWNUMBER     SALESORDERID       ORDERDATE                        507/01/20011111111                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              你会注意到结果被划分为分区,每个分区都是有相同订单日期的线路的集合。这意味着按订单日期划分。
: z0 B- R6 z5 n( U在分区内,行按orderdate排序,如(按orderdate排序,按orderdate5 y% k0 U" u0 c# }, Q' ^2 R
asc第二句所示的排序)。这不是很有用,因为分区中的所有行都会有相同的orderdate。因此,分区中行的顺序是随机的。尝试在partition4 |) p: F* R3 A
by子句中按salesorderid为了获得更重复的结果,排序。5 c+ E8 @3 o: c
row_number()只返回每个分区的顺序
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则