10bet网址
MySQL 8.0参考手册
相关的文档10bet官方网站 本手册下载 本手册摘录

12.21.4命名的窗口

Windows可以被定义和赋予用来引用它们的名称条款。要做到这一点,使用窗口条款。如果在查询中存在,则窗口从句位于the的位置之间命令子句,并且有这样的语法:

窗口window_name(window_spec) (window_name(window_spec)]…

对于每个窗口定义,window_name是窗口名称,和window_spec是同一类型的窗口规范之间的括号条款,如第12.21.2节,“窗口函数的概念和语法”:

window_spec:【window_name][partition_clause][order_clause][frame_clause]

一个窗口子句对于包含多个的查询是有用的否则,子句将定义同一个窗口。相反,您可以定义窗口一次,给它一个名称,然后在条款。考虑这个查询,它多次定义了同一个窗口:

SELECT val () OVER (ORDER BY val) AS ' ROW_NUMBER ', RANK() OVER (ORDER BY val) AS ' ROW_NUMBER ', DENSE_RANK() AS ' DENSE_RANK ';

通过使用,可以更简单地编写查询窗口控件中按名称引用窗口的方法条款:

SELECT count () OVER w AS ' ROW_NUMBER ', RANK() OVER w AS ' ROW_NUMBER ', DENSE_RANK() OVER w AS ' DENSE_RANK ' FROM numbers WINDOW w AS (ORDER BY val);

命名窗口还使试验窗口定义更容易,以查看对查询结果的影响。控件中的窗口定义只需修改窗口多句,而不是多句条款的定义。

如果一个使用条款/ (window_name…)而不是window_name,命名窗口可以通过添加其他子句来修改。例如,这个查询定义了一个包含分区和使用的窗口命令以不同方式修改窗口的子句:

SELECT DISTINCT year, country, FIRST_VALUE(year) OVER (w ORDER BY year DESC) AS first, FIRST_VALUE(year) OVER (w ORDER BY year DESC) AS last FROM sales WINDOW w AS(按国家划分);

一个子句只能向指定窗口添加属性,不能修改它们。如果已命名窗口定义包含分区、排序或框架属性,则引用窗口名的子句不能包含相同类型的属性,否则会出错:

  • 允许此构造是因为窗口定义和引用子句不包含相同类型的属性:

    OVER (w ORDER BY country)…窗口AS(按国家划分)
  • 此结构不允许,因为子句指定分区的对于已经存在的命名窗口分区的:

    OVER (w PARTITION BY year)…窗口AS(按国家划分)

命名窗口的定义本身可以以window_name。在这种情况下,允许向前和向后引用,但不允许循环:

  • 这是允许的;它包含了向前和向后的引用,但没有循环:

    WINDOW w1 AS (w2), w2 AS (), w3 AS (w1)
  • 这是不允许的,因为它包含一个循环:

    WINDOW w1 AS (w2)、w2 AS (w3)、w3 AS (w1)