Sql Server 开窗函数Over()的使用实例详解

Sql Server 开窗函数Over()的使用实例详解

简介

开窗函数 (Window Functions),顾名思义即为 “在一组 rows 中开一个窗,然后计算在这个窗口中的函数”,它是近年来 SQL 中一大特性。

在 SQL Server 2005 版本推出 Window Functions。而在 2012 版本中,提供了更多的 Window Functions 函数,极大的丰富了 SQL 的聚合计算能力,例如 ROW_NUMBER(), RANK(), DENSE_RANK()等函数。

本文将对 SQL Server 开窗函数 Over() 的使用做出详细说明,提供两个具体的实例说明。

Over()函数

Over()函数是窗口函数中最重要的一个函数,用于定义该窗口中计算时的行为。

Over()函数的基本格式为:

OVER ([partition_by_clause] [order_by_clause] [row/clause)

partition_by_clause

通过该语句对数据进行分组,仅对当前分组执行分析函数。如果没有指定 partition_by_clause,则所有行视为一个分组。

order_by_clause

该语句用于对窗口中的行进行排序,如果省略该语句,则不会对窗口中的行做任何排序操作。

row/clause

该语句指定窗口中的行数范围,如果我们没有给出 row/clause,则窗口包含分组的所有行。

更多开窗函数相关语法可查看官方文档

实例分析

在下面的实例中,我们将通过实现对下面的表进行查询。

数据表 orders:
| 订单号 | 客户ID | 订单日期 | 订单总额 |
| ---- | ---- | ---- | ---- |
| 1 | A1 | 2021-01-01 | 100 |
| 2 | A1 | 2021-01-04 | 50 |
| 3 | A2 | 2021-01-05 | 70 |
| 4 | A2 | 2021-01-06 | 200 |
| 5 | A1 | 2021-01-07 | 300 |

实例1:查询分组后每个客户的订单号及订单总额

SELECT 
  [订单号],
  [客户ID],
  [订单总额],
  SUM ([订单总额])
    OVER (PARTITION BY [客户ID])
    AS [客户总订单额]
FROM
  orders;

执行结果:
| 订单号 | 客户ID | 订单总额 | 客户总订单额 |
| ---- | ---- | ---- | ---- |
| 2 | A1 | 50 | 450 |
| 1 | A1 | 100 | 450 |
| 5 | A1 | 300 | 450 |
| 3 | A2 | 70 | 270 |
| 4 | A2 | 200 | 270 |

分析:

  • OVER (PARTITION BY [客户ID]) 按客户ID进行分组,sum([订单总额]) 将当前窗口下客户ID的订单总额累加,输出到整列结果 AS [客户总订单额] 中;
  • 最终输出分组后的每个订单号、订单总额和客户总订单额。

实例2:查询分组后每个客户每个订单的对比情况

SELECT 
  *,
  [订单总额]
    - SUM ([订单总额]) OVER(PARTITION BY [客户ID] ORDER BY [订单日期] ASC ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING)
    AS [订单总额差值]
FROM orders;

执行结果:
| 订单号 | 客户ID | 订单日期 | 订单总额 | 订单总额差值 |
| ---- | ---- | ---- | ---- | ---- |
| 1 | A1 | 2021-01-01 | 100 | 0 |
| 2 | A1 | 2021-01-04 | 50 | -50 |
| 5 | A1 | 2021-01-07 | 300 | -150 |
| 3 | A2 | 2021-01-05 | 70 | 0 |
| 4 | A2 | 2021-01-06 | 200 | 130 |

分析:

  • OVER(PARTITION BY [客户ID] ORDER BY [订单日期] ASC ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) 分组按照客户ID和订单日期排序,[订单总额] 与窗口前一行的总额做差得到 [订单总额差值]
  • 最终输出分组后每个订单的差值对比结果。

结论

Over()函数的使用,是开窗函数运用的核心,对于 SQL 语言的数据维度扩展,也提供了一个全新的思维视角。

除以上两个示例,OVER()函数还可以完成更多类似计算、筛选等操作,可根据实际需求进行探索和创新。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Sql Server 开窗函数Over()的使用实例详解 - Python技术站

(0)
上一篇 2023年5月21日
下一篇 2023年5月21日

相关文章

  • Apache中启用Server Status配置示例

    下面我将介绍如何在Apache中启用Server Status配置,并给出两个示例说明。 1. 配置前的准备工作 在进入配置之前,需要确认以下两个前提条件: Apache中需要安装mod_status模块,可以通过执行以下命令来安装: sudo apt-get install libapache2-mod-status 安装完成后需要启用模块,可以通过执行以…

    database 2023年5月22日
    00
  • CentOS7.4下MySQL5.7.28二进制方式安装的方法步骤

    接下来我将为你详细讲解“CentOS7.4下MySQL5.7.28二进制方式安装的方法步骤”的完整攻略。 环境准备 在开始安装MySQL之前,我们需要先进行环境准备。具体步骤如下: 确保CentOS7.4已经安装,并且处于最新状态。可以使用以下命令进行操作: sudo yum update -y 安装必要的依赖。在CentOS7.4上,可以使用以下命令安装:…

    database 2023年5月22日
    00
  • 如何使用Python连接到Oracle数据库?

    以下是如何使用Python连接到Oracle数据库的完整使用攻略。 使用Oracle数据库的前提条件 在使用Python连接Oracle数据库之前,需要确保已经安装Oracle数据库,并经启动Oracle服务器,同时需要安装Python的Oracle驱动_Oracle。 步骤1:导入模块 在Python中使用cx_Oracle模块连接Oracle数据库。以下…

    python 2023年5月12日
    00
  • 计算机二级考试MySQL知识点 常用MYSQL命令

    MYSQL知识点概述 MySQL是一个开源的关系型数据库管理系统,在计算机二级考试中,也是常见的考点之一。掌握MYSQL的相关知识,可以帮助我们更好地理解数据库的操作和应用,从而提高数据库的设计效率。下面主要介绍MYSQL考试中比较重要的几个方面,如常用MYSQL命令,此外还包括 MYSQL的基本操作,MYSQL的基本语法。 常用MYSQL命令 (1)MYS…

    database 2023年5月19日
    00
  • go操作redis

    导学: 如何学习? 本人建议先安装redis,如何在命令敲一遍,最后再用go来实现效果更好。实战!实战!不实战就是凉凉!!!!!!! 1.1什么是redis? redis:远程字典服务,是一种运行在内存上的非关系型数据库,它支持的数据类型有:字符串,哈希表,列表,集合(集合分有序/无序)。redisd的所有操作均是原子性的,redis不仅多个操作支持事务,而…

    Redis 2023年4月10日
    00
  • 详解Node使用Puppeteer完成一次复杂的爬虫

    一、概述 在Node.js中,Puppeteer是一个高效的爬虫工具。因为它使用的是Chrome浏览器的Headless模式,可以对JavaScript动态生成的网页进行操作。同时,Puppeteer还提供了WebAPI,可以模拟用户的行为,如键盘鼠标操作、表单提交等。本攻略将详细讲解使用Puppeteer完成一次复杂的爬虫。 二、安装Puppeteer n…

    database 2023年5月21日
    00
  • JAVA mongodb 聚合几种查询方式详解

    JAVA MongoDB 聚合几种查询方式详解 MongoDB是一个非常流行的NoSQL数据库,它支持强大的聚合查询功能,可以让我们对数据进行更加灵活的统计和分析。本文将详细讲解JAVA语言中如何使用MongoDB实现聚合查询。 什么是聚合查询 聚合查询是一种特殊的查询方式,它可以将多个文档合并成一个或多个文档,实现类似SQL中GROUP BY的功能。聚合查…

    database 2023年5月21日
    00
  • MySQL的mysqldump工具用法详解

    MySQL的mysqldump工具用法详解 什么是mysqldump mysqldump 是一个用于将 MySQL 数据库备份为SQL语句的工具,可以将数据库的结构和数据导出到文本文件。你可以将这个文本文件用于备份、复制、迁移数据。 mysqldump的语法 mysqldump [options] [database [tables]] mysqldump …

    database 2023年5月22日
    00
合作推广
合作推广
分享本页
返回顶部