【问题标题】:Why does the sum() window function require order by, when it has "between unbounded preceding and unbounded following"?为什么 sum() 窗口函数需要排序,当它具有“在无限的前面和无限的后面之间”时?
【发布时间】:2022-01-22 03:32:51
【问题描述】:

我今天尝试类似的操作时出错

sum(balance) over(rows between unbounded preceding and unbounded following)

错误是窗口需要 order by 语句。但是,当对所有行求和时(这与没有窗口函数的简单 sum(balance) 给出相同的结果),不需要按信息排序。不仅如此,我不希望 SQL 浪费时间对我的行进行排序,只是为了将它们全部相加。

在这种情况下 SQL 需要 order by 是否有充分的理由?是我天真,我错过了什么,还是这实际上是不必要的?

【问题讨论】:

  • 如果没有某种order,您将如何确定之前(之前)或之后(之后)的内容?
  • 指定窗框时需要order by语句。就做sum over()
  • 如果你想把它们全部加起来,那么使用over(),里面没有任何东西。

标签: sql sum snowflake-cloud-data-platform window-functions


【解决方案1】:

为了计算整个窗口,无需提供ORDER BY 和窗口框架:

SELECT SUM(balance) OVER(PARTITION BY col)
FROM tab

SELECT SUM(balance) OVER()
FROM tab

【讨论】:

  • 谢谢,这似乎是最好的写法。我已经习惯了OVER() 本身有一个隐含的ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING,而OVER(ORDER BY column_name) 有一个隐含的RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW。我想知道这是否都是一般规则。
  • @doublefelix 至于 OVER(ORDER BY col_name) 它在文档Window Frame Usage Notes 中有描述
【解决方案2】:

是的,Snowflake,可以看到您的 unbounded precedingunbounded following 使其与 SUM(balance) 相同,因此像许多其他 DB 一样为您重写它,

OR 你可以学会询问你想要的东西而不是编写糟糕的 SQL,然后让数据库在每次和其他每条 SQL 出现时都必须自动进行魔法清理运行。

【讨论】:

  • 您不了解用例,因此您的批评被误导了。在上下文中,我不只是使用没有窗口函数的 sum() 是有原因的,即这不是该表应该具有的粒度。不仅如此,这实际上并不能回答问题。
  • @doublefelix 您是对的,我无法读懂您的想法,也无法理解您遗漏的未说明细节,因为“它们不会增加物质价值”,尽管您想指出存在未说明的事实。我支持“你所说的问题似乎是错误的”,我注意到你没有编辑你的问题来添加那些使问题有意义的细节。
猜你喜欢
  • 2013-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-23
  • 1970-01-01
  • 2022-01-17
  • 1970-01-01
相关资源
最近更新 更多