• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • 命名为Windows

    可以定义Windows并为其指定名称,以便在OVER子句中引用它们。为此,请使用WINDOW子句。如果查询中存在WINDOW子句,则该子句位于HAVINGand ORDER BY子句的位置之间,并具有以下语法:

    WINDOW window_name AS (window_spec)
        [, window_name AS (window_spec)] ...
    

    对于每个窗口定义,window_name都是窗口名称,并且window_spec是与OVER子句括号之间给出的窗口规范类型相同的窗口规范,如“窗口函数的概念和语法”中所述:

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

    WINDOW子句对于其中多个查询是有用OVER的条款,否则定义相同的窗口。相反,您可以一次定义窗口,给它命名,然后在OVER子句中引用该名称。考虑以下查询,它多次定义了相同的窗口:

    SELECT
      val,
      ROW_NUMBER() OVER (ORDER BY val) AS 'row_number',
      RANK()       OVER (ORDER BY val) AS 'rank',
      DENSE_RANK() OVER (ORDER BY val) AS 'dense_rank'
    FROM numbers;
    

    通过使用WINDOW一次定义窗口并在OVER子句中按名称引用窗口,可以更简单地编写查询:

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

    命名窗口还使您更容易尝试使用窗口定义来参见对查询结果的影响。您只需要修改WINDOW子句中的窗口定义,而无需修改多个OVER子句定义。

    如果OVER子句使用而不是,则可以通过添加其他子句来修改命名窗口。例如,此查询定义一个包含分区的窗口,并在子句中使用该窗口以不同方式修改该窗口:OVER(window_name...)OVER window_nameORDER BYOVER

    SELECT
      DISTINCT year, country,
      FIRST_VALUE(year) OVER (w ORDER BY year ASC) AS first,
      FIRST_VALUE(year) OVER (w ORDER BY year DESC) AS last
    FROM sales
    WINDOW w AS (PARTITION BY country);
    

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

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

      OVER (w ORDER BY country)
      ... WINDOW w AS (PARTITION BY country)
      
    • 不允许使用此构造,因为该OVER子句指定PARTITION BY了已经具有的命名窗口PARTITION BY

      OVER (w PARTITION BY year)
      ... WINDOW w AS (PARTITION BY country)
      

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

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

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

      WINDOW w1 AS (w2), w2 AS (w3), w3 AS (w1)