【问题标题】:sum() Over(partition by order by a,b)sum() Over(按 a,b 顺序分区)
【发布时间】:2022-01-08 11:33:18
【问题描述】:

我有一张桌子:

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 子句只是改变了顺序,我们根据分区应用窗口聚合函数。但令我惊讶的是,我得到了附加的输出。 .

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

【问题讨论】:

  • 两者都是定义组(分区)内的运行总计 - 第一个只有一个组“fname”,因此 sum 给出了这一组的总数,顺序是多余的;第二个是由 o_details 定义的 3 个组的运行总数,按字母顺序降序排列,因此您有 20、(20+60) 然后是 (20+60+350)
  • 顺便说一句,我注意到您尚未接受对您之前问题的任何答案,这是有原因的吗?
  • @Stu:感谢您的回答,“尚未接受答案”是什么意思?我看不到任何接受或拒绝回答的弹出窗口。
  • @stu:我明白你的意思。已接受答案。

标签: sql postgresql window-functions


【解决方案1】:

来自9.22. Window Functions

当聚合函数用作窗口函数时,它聚合 在当前行的窗口框架内的行上。使用的聚合 使用ORDER BY 并且默认的窗口框架定义产生一个 “运行总和”类型的行为,可能是也可能不是想要的。 要获得整个分区的聚合,请省略 ORDER BY 或使用 ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING。其他 帧规范可用于获得其他效果。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-08
    • 1970-01-01
    • 2012-03-30
    • 2019-03-13
    • 2022-11-25
    • 1970-01-01
    • 1970-01-01
    • 2011-03-26
    相关资源
    最近更新 更多