回答

收藏

试图了解over()和分区

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

我试图通过包裹在我头上的功能来解决问题。这是一个我不明白的例子。
4 I/ j) a1 W6 ?( R/ v) E这是我的数据:
3 \# M- L, r7 `1 C1 \2 l' @" zSALESORDERID       ORDERDATE                                                 07/01/2001/20014386711                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 运行此查询时:
& Z' a5 D+ m* T$ bselect Row_Number() over(partition by orderdate order by orderdate asc)     as Rownumber,salesorderid,orderdatefrom test2order by rownumber这是我的结果:1 f- H# X; S) t* ^! e/ T& Z
ROWNUMBER     SALESORDERID       ORDERDATE                      807/01/20001/20001111                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             有人可以向我解释这个查询。SQL并不陌生,但我一直在挣扎的窗口工作,无法解决这个问题。
) d  K" S' b/ H7 t8 Y                                                                ( G* R+ e; D9 ~: Q1 f& v* Y8 o# [0 e
    解决方案:                                                                * }! V3 O0 V: f* {) g
                                                                试着按照订单日期订购,你会更容易看到结果6 ]/ \% ~! G/ ^. H+ o4 z9 m- s+ \9 ^
select Row_Number() over(partition by orderdate order by orderdate asc)     as Rownumber,salesorderid,orderdatefrom test2order by orderdate;应该给(为了明确起见,我加了空行)
6 k1 ~- B) u& N: G: G. R) C9 BROWNUMBER     SALESORDERID       ORDERDATE                        507/01/20011111111                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              你会注意到结果被划分为分区,每个分区都是有相同订单日期的线路的集合。这意味着按订单日期划分。$ Q3 U3 v2 p( r5 f- e* P  [$ W
在分区内,行按orderdate排序,如(按orderdate排序,按orderdate- w4 h1 j2 W4 f4 m) K% O% Y
asc第二句所示的排序)。这不是很有用,因为分区中的所有行都会有相同的orderdate。因此,分区中行的顺序是随机的。尝试在partition* J- W% _% b2 T/ }8 S
by子句中按salesorderid为了获得更重复的结果,排序。
: F8 o1 W$ B4 a5 }/ u" b0 @# `row_number()只返回每个分区的顺序
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则