首页 > 数据库 >SQL 窗口函数的速查表

SQL 窗口函数的速查表

时间:2022-12-08 10:33:07浏览次数:32  
标签:选项 速查表 窗口 函数 OVER 子句 SQL ORDER

SQL 窗口函数的速查表,包括窗口函数的语法、窗口函数列表以及相关示例,内容适用于 MySQL、Oracle、SQL Server、PostgreSQL 以及 SQLite 等关系型数据库。

窗口函数概述

窗口函数(Window Function)基于一个滑动窗口,也就是与当前行相关的一组数据行为其计算出一个结果;通常也称为分析函数(Analytic Function)。

我们知道,聚合函数(Aggregate Function)用于将一组数据汇总成一个结果;而窗口函数则为每一行数据计算出一个结果。它们的区别如下图所示:

窗口函数的语法如下:

SELECT column1, column2,
  window_function OVER (
    PARTITION BY ...
    ORDER BY ...
    frame_clause) AS column_alias
FROM table_name;

其中,window_function 是窗口函数的名称;OVER 子句包含三个可选项:分区(PARTITION BY)、排序(ORDER BY)以及窗口大小(frame_clause)。

以下是一个窗口函数的示例:

SELECT city, month, 
  sum(sold) OVER (
    PARTITION BY city 
    ORDER BY month 
    RANGE UNBOUNDED PRECEDING) total
FROM sales;

该查询返回了不同城市,按照月份排序后,累计到每个月份的总销量;OVER 子句中各个选项的作用在下文中进行介绍。

窗口函数还提供了命名窗口的功能:

SELECT column1, column2,
  window_function1 OVER window_name 
  window_function2 OVER window_name 
FROM table_name
WINDOW window_name AS (
  PARTITION BY ...
  ORDER BY ...
  frame_clause);

当多个窗口函数的 OVER 子句完全相同,命名窗口可以简化函数的输入。MySQL、PostgreSQL、SQLite 支持命名窗口,Oracle、SQL Server 不支持。

PARTITION BY

OVER 子句中的 PARTITION BY 选项用于定义分区,作用类似于 GROUP BY 分组;如果指定了分区选项,窗口函数将会分别针对每个分区单独进行分析;否则,所有数据作为一个整体进行分析。

以下查询按照不同 city 统计总销量:

SELECT month, city, sold,
  sum(sold) OVER (
    PARTITION BY city ) sum
FROM sales;

ORDER BY

OVER 子句中的 ORDER BY 选项用于指定分区内的排序方式,与 ORDER BY 子句的作用类似;排序选项通常用于数据的排名分析。下图演示了按照 city 分区、按照 month 排序之后的数据:

窗口大小

OVER 子句中的 frame_clause 选项用于指定一个滑动的窗口。窗口总是位于分区范围之内,是分区的一个子集。指定了窗口之后,分析函数不再基于分区进行计算,而是基于窗口内的数据进行计算。

指定窗口大小的语法如下:

ROWS | RANGE | GROUPS BETWEEN frame_start AND frame_end

其中,ROWS 表示以行为单位计算窗口的偏移量;RANGE 表示以数值(例如 10 天之内)为单位计算窗口的偏移量;GROUPS 以组(ORDER BY 排序相同的数据为一组)为单位计算窗口的偏移量,只有 PostgreSQL、SQLite 支持 GROUPS 选项。

frame_start 用于定义窗口的起始位置,可以指定以下内容之一:

  • UNBOUNDED PRECEDING,窗口从分区的第一行开始;
  • N PRECEDING,窗口从当前行之前的第 N 行、范围 N 之内或者第 N 个组开始;
  • CURRENT ROW,窗口从当前行开始。

frame_end 用于定义窗口的结束位置,可以指定以下内容之一:

  • CURRENT ROW,窗口到当前行结束;
  • M FOLLOWING,窗口到当前行之后的第 M 行、范围 M 之内或者第 M 个组结束;
  • UNBOUNDED FOLLOWING,窗口到分区的最后一行结束。

以下是窗口选项的一些示例:

第一个窗口使用 ROWS 选项,包含了前后各 1 行以及当前行;第二个窗口使用 RANGE 选项,包含了当前行的数值减去 1(4-1=3)到当前行的数值加上 1(4+1=5)之间的所有数据;第三个窗口使用 GROUPS 选项,包含了前后各 1 组(ORDER BY 排序相同的数据为一组)和当前行。

如果没有指定窗口大小选项,默认使用的窗口如下:

  • 如果指定了 ORDER BY, 默认窗口为 RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW;
  • 如果没有指定 ORDER BY, 默认窗口为 ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING。

SQL 子句逻辑执行顺序

窗口函数可以用于 SELECT 列表或者 ORDER BY 子句中,但是不能出现在其他子句中。各种 SQL 子句的逻辑执行顺序如下:

  1. FROM、JOIN
  2. WHERE
  3. GROUP BY
  4. 聚合函数
  5. HAVING
  6. 窗口函数
  7. SELECT
  8. DISTINCT
  9. UNION、INTERSECT、EXCEPT、MINUS
  10. ORDER BY
  11. OFFSET
  12. LIMIT、FETCH、TOP

 

标签:选项,速查表,窗口,函数,OVER,子句,SQL,ORDER
From: https://www.cnblogs.com/xfeiyun/p/16965394.html

相关文章

  • 5、mybatis连接sqlserver数据库
    1          在idea的maven项目下,使用mybatis连接sqlserver数据库 2          下载Sqljdbc4.jar包2.1         地址:​​http://mvnrepository......
  • [转]MySQL数据类型详解
    原文地址:https://www.cnblogs.com/lteal/archive/2013/03/04/2943061.htmlMySQL数据类型,可以被分为3类:数值类型、日期和时间类型以及字符串(字符)类型 方括号(“[”和......
  • 滑动窗口
    一、引入窗口概念的原因我们都知道TCP是每发送一个数据,都要进行一次确认应答。当上一个数据包收到了应答了,再发送下一个。这个模式就有点像我和你面对面聊天,你一句我......
  • sql生成数据库字典 Oracle sql server
    SELECT--A.COLUMN_IDAS字段序号,A.TABLE_NAME表名,TT.comments表说明,A.COLUMN_NAMEAS字段名,D......
  • postgresql 之 数据目录内部结构 简介
    转:https://blog.csdn.net/happytree001/article/details/125610460一、一切皆为Oid在Linux中一切皆为文件,在postgresql中一切皆为Oid。1.1什么是OidObjectidentifier......
  • linux设置mysql开机自启
    版权声明:本文为博主原创文章,遵循CC4.0BY-SA版权协议,转载请附上原文出处链接和本声明。本文链接:https://blog.csdn.net/yylhm1125/article/details/125738283  1.......
  • postgresql数据库导入导出
    一、常规操作1、进入数据库psql-hlocalhost-p5432-Ukong2、查看库kong=#\lListofdatabasesName|Owner|Encodin......
  • sqli-labs靶场第23关(学习记录)
    第23关考察点:对注释符的过滤看一下代码发现是对注释符#和--的过滤,当我们传入内容包含注释符时,对应的注释符就被换成了"",因此注释就无效了?id=-1'unionsele......
  • MySQL
    MySQLWHERE子句我们知道从MySQL表中使用SQLSELECT语句来读取数据。如需有条件地从表中选取数据,可将WHERE子句添加到SELECT语句中。语法以下是SQLSELECT语句......
  • MYsql
    Mysql下载安装卸载配置教程Mysql下载下载之后打开安装好安装好呢可以去管理查看有没有MySQL的服务那么如何运行mysql的服务呢cmd管理员命令打开输入netst......