sum() Over(按a,b顺序划分)

sum() Over(partition by order by a,b)

我有一个 table:

fname|o_details| cost
eva  |coat|125
eva  |coat|225
eva  |shirt|60
eva  |slipper|20
farida|coat|100
farida|shirt|50
farida|shoes|80
farida|skirt|30
henry|shoes|80

我试图了解以下两者之间的区别:

sum(cost) over(partition by fname order by fname desc) as part_by_fname,
sum(cost) over(partition by fname order by fname,o_details desc) as part_by_both

我的理解是 order by in over 子句只是改变顺序,我们根据分区应用 window 聚合函数。但令我惊讶的是,我得到了附加的输出。 .

请解释这两个 over 子句背后的逻辑以及它们的不同之处

来自 9.22. Window Functions:

When an aggregate function is used as a window function, it aggregates over the rows within the current row's window frame. An aggregate used with ORDER BY and the default window frame definition produces a “running sum” type of behavior, which may or may not be what's wanted. To obtain aggregation over the whole partition, omit ORDER BY or use ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING. Other frame specifications can be used to obtain other effects.

当您 ORDER BY fname 时,分区中的所有行都按该顺序具有“相同”位置。你也PARTITION BY fname,所以ORDER BY fname没有作用。因此,window 框架对于分区中的所有行都是相同的,因此函数的结果也是如此。

那么,当你ORDER BY o_details的时候,它就有效果了。行在分区中的位置不再相同。由于框架是相对于该顺序中行的位置的,因此几乎每一行都是不同的,函数的结果也是如此。我写的差不多,因为这并不完全适用于'eva'的两个fname'coat'相同的o_details。他们共享一个位置。因此,对于这两行,由于上述原因,函数的结果再次相同。