![](/img/trans.png)
[英]Oracle - SELECT DENSE_RANK OVER (ORDER BY, SUM, OVER and PARTITION BY)
[英]sum() Over(partition by order by a,b)
我有一张桌子:
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 聚合 function 。 但令我惊讶的是,我收到了随附的 output。 .
请解释这两个 over 子句背后的逻辑以及它们的不同之处
当聚合 function 用作 window function 时,它聚合当前行的 Z2FB45B8C735CBD2702 帧内的行。 与
ORDER BY
和默认 window 帧定义一起使用的聚合会产生“运行总和”类型的行为,这可能是也可能不是想要的。 要获得整个分区的聚合,请省略ORDER BY
或使用ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
。 可以使用其他框架规格来获得其他效果。
当您按ORDER BY fname
排序时,分区内的所有行都按该顺序具有“相同”的 position。 您还PARTITION BY fname
,所以ORDER BY fname
无效。 因此,window 帧对于分区中的所有行都是相同的,因此函数的结果也相同。
然后,当您ORDER BY o_details
时,它会产生效果。 分区中行的 position 不再对所有行都相同。 由于帧是相对于该行的 position 的顺序,因此几乎每一行都不同,函数的结果也不同。 我写的差不多,因为这并不完全适用于'eva'
的两个fname
和'coat'
的o_details
相同。 他们共享一个 position。 因此,对于这两行,由于上述原因,函数的结果再次相同。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.