【问题标题】:Where does OVER clause fall in the SQL logical processing order?OVER 子句在 SQL 逻辑处理顺序中的位置是什么?
【发布时间】:2020-05-13 16:45:51
【问题描述】:

通常的SQL逻辑处理顺序是:

FROM
ON
JOIN
WHERE
GROUP BY
WITH CUBE or WITH ROLLUP
HAVING
SELECT
DISTINCT
ORDER BY
TOP

OVER子句在SQL逻辑处理顺序中的位置?我试图从逻辑上理解 OVER 是否在数据分组之后发生(即 - 在 HAVING 之后和 SELECT 之前)。我很困惑 DISTINCT、ORDER BY 和 TOP 是否对 OVER 子句使用的数据窗口有任何影响。

参考:https://docs.microsoft.com/en-us/sql/t-sql/queries/select-transact-sql?view=sql-server-ver15#logical-processing-order-of-the-select-statement

【问题讨论】:

  • OVER 是表达式的一部分,例如在 SUMLAG 中,它没有自己的执行顺序,因为 OVER 本身没有查询的一部分。 SUMLAG 将在它声明的任何位置运行(这可能是查询的 HAVINGSELECT 部分)。您要问的类似于“CASE 在执行顺序中的位置”或“CONVERT 在执行顺序中的位置?”
  • @Larnu 我认为问题是一般何时执行 windowed/analytical functions 及其含义 - 即何时可以使用结果、嵌套过滤器和很快。在我看来这是一个很好的问题 - 它有助于理解为什么你不能在 WHERE 中使用结果,为什么你可以在窗口函数中使用聚合以及如何使用 QUALIFY 子句(供应商扩展)进行过滤

标签: sql sql-server window-functions


【解决方案1】:

A Beginner’s Guide to the True Order of SQL Operations by Lukas Eder:

操作的逻辑顺序如下(为了“简单”,我是 省略供应商特定的内容,例如 CONNECT BY、MODEL、 MATCH_RECOGNIZE、PIVOT、UNPIVOT 和所有其他):

FROM: ...
WHERE: ...
GROUP BY: ...
HAVING: … 

WINDOW: 
If you’re using the awesome window function feature, this is the step where they’re all calculated. Only now. 
And the cool thing is, because we have already calculated (logically!) all the aggregate functions, we can nest aggregate functions in window functions. 
It’s thus perfectly fine to write things like sum(count(*)) OVER () or row_number() OVER (ORDER BY count(*)). 
Window functions being logically calculated only now also explains why you can put them only in the SELECT or ORDER BY clauses.
They’re not available to the WHERE clause, which happened before.

SELECT: ....
DISTINCT: ...
UNION, INTERSECT, EXCEPT: ...
ORDER BY: ....
OFFSET: .
LIMIT, FETCH, TOP: ...

相关:

Why no windowed functions in where clauses?

Snowflake - QUALIFY

QUALIFY 子句过滤窗口函数的结果。 QUALIFY 对窗口函数的作用与 HAVING 对聚合函数和 GROUP BY 子句的作用一样。

【讨论】:

    【解决方案2】:

    您将 表达式子句 混淆了。

    尽管在 SQL Server 文档中称为“子句”,OVER 是分析函数的一部分。它是一个返回标量结果的表达式。

    分析函数可以出现在SELECT 子句和ORDER BY 子句中。它们被解析为这些子句的一部分。

    顺便说一句,SQL 是一种描述性 语言而不是过程 语言。查询未指定“执行顺序”。这是由编译器和优化器决定的。您指的是“解析顺序”,它解释了如何在查询中解析标识符。

    我认为的困惑通常追溯到这个reference。文档很清楚,这指的是“逻辑处理顺序”,(“此顺序确定一个步骤中定义的对象何时可用于后续步骤中的子句。”)但无论如何人们似乎很困惑。

    【讨论】:

    • 考虑逻辑执行顺序是有意义的,以实现例如应用 GROUP BY 和 HAVING 后窗口将位于结果集上
    • 我现在将问题更新为“逻辑处理顺序”
    • @variable 。 . .它不会改变答案。 over 是表达式中的一个子句(遗憾的是它们具有相同的名称)。 “逻辑处理顺序”基于select 语句中的子句。
    • 是的,我知道。但不幸的是,这个答案似乎根本没有关注逻辑处理顺序的关键问题。它讨论了标识符的解析和解析,并将关键问题降级为“混淆来源”下的脚注
    • 我在上面线程的初始评论中提出了它 - 在作为 IMO 进行任何编辑之前,它显然比这个答案中给出的处理更相关(这对What you are referring to is the "order of parsing", which explains how identifiers are resolved in the query 有点不屑一顾)跨度>
    猜你喜欢
    • 2014-03-21
    • 2015-07-31
    • 2014-12-25
    • 2019-05-15
    • 2020-08-15
    • 1970-01-01
    • 1970-01-01
    • 2015-03-20
    • 1970-01-01
    相关资源
    最近更新 更多