【问题标题】:Partition Over Ordering Effect分区顺序效应
【发布时间】:2015-04-20 21:31:44
【问题描述】:

Oracle 子句OVER(PARTITION BY SUM(some_field)) 具有隐式排序效果,我的结果数据是否会按SUM(some_field) 排序而无需额外 ORDER BY SUM(some_field) 子句?

【问题讨论】:

  • 唯一(实际上是only)保证结果的任何定义顺序的方法是使用order by。您看到的任何没有order by 的“订单”纯属巧合。

标签: sql oracle window-functions


【解决方案1】:

没有。 SELECT 语句中的分析函数并不暗示结果的任何特定顺序。请记住,您的查询中可以有多个分析函数,每个函数都以不同的顺序查看行,因此对结果进行隐含排序是没有意义的。如果您希望以特定顺序返回结果,请使用ORDER BY 子句。

【讨论】:

  • 谢谢!如果我有特殊情况怎么办?我的意思是 SELECT 语句中只有一个分析函数,即 SELECT MIN(SALE_DATE) OVER (PARTITION BY SUM(SALE_SUM)) FROM sales_1 GROUP BY sale_date 。我可以确定SUM*SALE_SUM) 的排序结果吗?
  • @Andrew - 我的答案是正确的 - 没有隐含的排序。如果您关心返回结果的顺序,则必须始终包含ORDER BY。当然,包含分析函数可能会影响优化器选择碰巧以特定顺序返回结果的查询计划。但这不应该被依赖。
  • 好的,但是ORDER BY 表达式中的ORDER BY 子句也是如此,对吧?因为我在“解释计划”中看到WINDOW SORT 作为最后一个操作,所以我可以得出结论,我不必添加最终的 ORDER BY 子句。我说的对吗?
  • @Andrew - 如果你想保证结果的顺序,你必须添加一个ORDER BY 子句。总是。每次。没有例外。您可能会在不指定ORDER BY 的情况下按您想要的顺序获得结果,但这可能会随着查询计划的变化、新版本的Oracle 的出现以及基础数据的变化而随着时间的推移而变化。除非您希望有人询问为什么由于查询计划更改而在 6 个月内没有对结果进行排序,否则请包括 ORDER BY
  • 多年前人们对GROUP BY 的看法是一样的——既然结果总是按顺序出现,为什么还要加上ORDER BY?但由于优化器的变化,它们现在(通常)不会。
猜你喜欢
  • 1970-01-01
  • 2016-04-15
  • 1970-01-01
  • 2014-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-10
相关资源
最近更新 更多