SQL SERVER的PARTITION BY应用场景

SQL SERVER的PARTITION BY关键字说明介绍

  • PARTITION BY关键字介绍
  • 具体使用场景
    • 排名计算
    • 累计求和
    • 分组求最值
    • 分组内百分比计算
    • 分组内移动平均计算
    • 分组内数据分布统计
    • 分组内数据偏移计算
  • 总结

PARTITION BY关键字介绍

在SQL SERVER中,关键字PARTITION BY主要用于窗口函数中,它能将查询结果集按照指定的列或表达式划分成多个分区(组),然后窗口函数会在每个分区内独立地进行计算

通俗来讲就是:它可以把结果集拆分成多个逻辑组,窗口函数会基于这些组来执行操作,而不是对整个结果集进行统一处理。这样就能在每个分区内完成特定的计算比如排名、求和、求平均值

具体使用场景

假设存在一个 Sales 表,包含 Region(地区)、Salesperson(销售人员)和 SalesAmount(销售金额)列

排名计算

要在每个地区内为销售人员按销售金额进行排名



SELECT 
    Region,
    Salesperson,
    SalesAmount,
    RANK() OVER (PARTITION BY Region ORDER BY SalesAmount DESC) AS SalesRank
FROM 
    Sales;
--PARTITION BY Region:将结果集按照 Region 列的值进行分区,每个地区形成一个独立的组。
--ORDER BY SalesAmount DESC:在每个地区分区内,按照 SalesAmount 列的值降序排序。
--RANK():为每个分区内的销售人员计算排名。

累计求和

若要计算每个地区内销售人员的累计销售金额,可以使用 SUM() 窗口函数

SELECT 
    Region,
    Salesperson,
    SalesAmount,
    SUM(SalesAmount) OVER (PARTITION BY Region ORDER BY Salesperson) AS CumulativeSales
FROM 
    Sales;
    --PARTITION BY Region:按 Region 列的值对结果集进行分区。
	--ORDER BY Salesperson:在每个地区分区内,按照 Salesperson 列的值进行排序。
	--SUM(SalesAmount):在每个分区内计算累计销售金额

分组求最值

在每个分组中找出最大值或最小值,例如有一个 Products 表,包含 Category(产品类别)、ProductName(产品名称)和 Price(价格)列,要找出每个类别中价格最高的产品信息

SELECT 
    Category,
    ProductName,
    Price
FROM (
    SELECT 
        Category,
        ProductName,
        Price,
        ROW_NUMBER() OVER (PARTITION BY Category ORDER BY Price DESC) AS rn
    FROM 
        Products
) subquery
WHERE 
    rn = 1;
    --这里先使用 PARTITION BY Category 将产品按类别分组,在每个类别分组内按照价格降序排列并为每行分配行号 rn,最后筛选出 rn = 1 的记录,也就是每个类别中价格最高的产品

分组内百分比计算

计算每个分组内某一数值占该组总和的百分比。假设有一个 Orders 表,包含 Region(地区)和 OrderAmount(订单金额)列,要计算每个地区的订单金额占该地区订单总金额的百分比

SELECT 
    Region,
    OrderAmount,
    OrderAmount * 1.0 / SUM(OrderAmount) OVER (PARTITION BY Region) AS Percentage
FROM 
    Orders;
    --PARTITION BY Region 把订单按地区分组,SUM(OrderAmount) OVER (PARTITION BY Region) 计算每个地区的订单总金额,然后用当前订单金额除以该地区总金额得到百分比

分组内移动平均计算

在分组内计算移动平均值,常用于分析数据的趋势。例如有一个 StockPrices 表,包含 StockSymbol(股票代码)、TradeDate(交易日期)和 ClosingPrice(收盘价)列,要计算每个股票最近 3 天的移动平均收盘价。

SELECT 
    StockSymbol,
    TradeDate,
    ClosingPrice,
    AVG(ClosingPrice) OVER (
        PARTITION BY StockSymbol 
        ORDER BY TradeDate 
        ROWS BETWEEN 2 PRECEDING AND CURRENT ROW
    ) AS MovingAverage
FROM 
    StockPrices;
    -- PARTITION BY StockSymbol 按股票代码分组,ORDER BY TradeDate 按交易日期排序,ROWS BETWEEN 2 PRECEDING AND CURRENT ROW 表示在当前行及前两行的范围内计算平均值,这样就得到了每个股票最近 3 天的移动平均收盘价

分组内数据分布统计

统计每个分组内不同数据区间的分布情况。比如有一个 Students 表,包含 Class(班级)和 Score(分数)列,要统计每个班级中不同分数段(如 0 - 59、60 - 79、80 - 100)的学生数量

SELECT 
    Class,
    CASE 
        WHEN Score BETWEEN 0 AND 59 THEN '0 - 59'
        WHEN Score BETWEEN 60 AND 79 THEN '60 - 79'
        WHEN Score BETWEEN 80 AND 100 THEN '80 - 100'
    END AS ScoreRange,
    COUNT(*) OVER (PARTITION BY Class, 
        CASE 
            WHEN Score BETWEEN 0 AND 59 THEN '0 - 59'
            WHEN Score BETWEEN 60 AND 79 THEN '60 - 79'
            WHEN Score BETWEEN 80 AND 100 THEN '80 - 100'
        END
    ) AS StudentCount
FROM 
    Students;
    --先通过 CASE 语句将分数划分成不同区间,然后使用 PARTITION BY Class, ScoreRange 按班级和分数段分组,COUNT(*) 统计每个分组内的学生数量

分组内数据偏移计算

计算每个分组内当前行与前一行或后一行数据的差值等偏移量。例如有一个 SalesData 表,包含 Product(产品)、Month(月份)和 SalesVolume(销售数量)列,要计算每个产品每月销售数量相较于前一个月的增长数量

SELECT 
    Product,
    Month,
    SalesVolume,
    SalesVolume - LAG(SalesVolume) OVER (PARTITION BY Product ORDER BY Month) AS Growth
FROM 
    SalesData;
    --PARTITION BY Product 按产品分组,ORDER BY Month 按月份排序,LAG(SalesVolume) 函数获取当前行前一行的销售数量,用当前行销售数量减去前一行的销售数量得到增长数量

总结

PARTITION BY 关键字让你可以在结果集的各个分组内执行复杂的计算,而不必对整个结果集进行统一处理。这在处理分组统计、排名、累计计算等场景时非常有用,能大大提升查询的灵活性和表达能力

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/970531.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++效率掌握之STL库:string底层剖析

文章目录 1.学习string底层的必要性2.string类对象基本函数实现3.string类对象的遍历4.string类对象的扩容追加5.string类对象的插入、删除6.string类对象的查找、提取、大小调整7.string类对象的流输出、流提取希望读者们多多三连支持小编会继续更新你们的鼓励就是我前进的动力…

SCI学术论文图片怎么免费绘制:drawio,gitmind

SCI学术论文图片怎么免费绘制 目录 SCI学术论文图片怎么免费绘制overleaf怎么图片不清晰怎么办SCI学术论文图片怎么导出pdfdrawiogitmind**1. 使用在线工具****Lucidchart****2. Draw.io****3. ProcessOn****4. 使用桌面工具****Dia****5. 使用Markdown工具(如Typora)**如果你…

对于RocksDB和LSM Tree的一些理解,以及TiDB架构初识

LSM Tree的读写过程 HBase、LevelDB,rocksDB(是一个引擎)底层的数据结构是LSM Tree适合写多读少的场景,都是追加写入内存中的MemTable,写入一条删除(或修改)标记,而不用去访问实际的…

Java 设计模式之迭代器模式

文章目录 Java 设计模式之迭代器模式概述UML代码实现Java的迭代器 Java 设计模式之迭代器模式 概述 迭代器模式(Iterator),提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露该对象的内部表示。 UML Iterator:迭代器接口&#xff…

【原创】解决vue-element-plus-admin无法实现下拉框动态控制表单功能,动态显隐输入框

前言 目前使用vue-element-plus-admin想要做一个系统定时任务功能,可以选择不同的定时任务类型,比如使用cron表达式、周期执行、指定时间执行等。每种类型对应不同的输入框,需要动态显隐输入框才行,但是这个vue-element-plus-adm…

上位机学习之串口通信与温湿度项目实战

文章目录 一、串口通信与温湿度项目实战1、学习串口通信硬件:巩固RS-485串口硬件和通信基础知识1.1、串行通信的数据流和格式1.2、串口通信参数设置1.3、modbus协议基础1.4、数据存储和功能代码1.5、modbus通信报文分析 2、主-从通信仿真测试2.1、组件设计2.2、创建…

深度求索—DeepSeek API的简单调用(Java)

DeepSeek简介 DeepSeek(深度求索)是由中国人工智能公司深度求索(DeepSeek Inc.)研发的大规模语言模型(LLM),专注于提供高效、智能的自然语言处理能力,支持多种场景下的文本生成、对…

Zotero7 从下载到安装

Zotero7 从下载到安装 目录 Zotero7 从下载到安装下载UPDATE2025.2.16 解决翻译api异常的问题 下载 首先贴一下可用的链接 github官方仓库:https://github.com/zotero/zotero中文社区:https://zotero-chinese.com/官网下载页:https://www.z…

沃德校园助手系统php+uniapp

一款基于FastAdminThinkPHPUniapp开发的为校园团队提供全套的技术系统及运营的方案(目前仅适配微信小程序),可以更好的帮助你打造自己的线上助手平台。成本低,见效快。各种场景都可以自主选择服务。 更新日志 V1.2.1小程序需要更…

Spring Boot (maven)分页3.0版本 通用版

前言: 通过实践而发现真理,又通过实践而证实真理和发展真理。从感性认识而能动地发展到理性认识,又从理性认识而能动地指导革命实践,改造主观世界和客观世界。实践、认识、再实践、再认识,这种形式,循环往…

解锁机器学习算法 | 线性回归:机器学习的基石

在机器学习的众多算法中,线性回归宛如一块基石,看似质朴无华,却稳稳支撑起诸多复杂模型的架构。它是我们初涉机器学习领域时便会邂逅的算法之一,其原理与应用广泛渗透于各个领域。无论是预测房价走势、剖析股票市场波动&#xff0…

广告深度学习计算:阿里妈妈大模型服务框架HighService

一、背景 HighService(High-Performance Pythonic AI Service) 是在支持阿里妈妈业务过程中,不断提炼抽象出的高性能Python AI服务框架,支持视频、图文、LLM等多种模型,能够显著加快模型的推理速度,提高集群的资源利用效率。随着S…

稀土抑烟剂——为汽车火灾安全增添防线

一、稀土抑烟剂的基本概念 稀土抑烟剂是一类基于稀土元素(如稀土氧化物和稀土金属化合物)开发的高效阻燃材料。它可以显著提高汽车内饰材料的阻燃性能,减少火灾发生时有毒气体和烟雾的产生。稀土抑烟剂不仅能提升火灾时的安全性,…

如何下载AndroidStudio的依赖的 jar,arr文件到本地

一、通过jitpack.io 下载依赖库 若需要下载 com.github.xxxxx:yy-zzz:0.0.2 的 jar则 https://jitpack.io/com/github/xxxxx/yy-zzz/0.0.2/ 下会列出如下build.logyy-zzz-0.0.2.jaryy-zzz-0.0.2.pomyy-zzz-0.0.2.pom.md5yy-zzz-0.0.2.pom.sha1jar 的下载路径为https://jitpack…

【仪器仪表专题】案例:示波器控制通道开关SCPI命令不同的原因

背景 在文章【仪器仪表专题】仪器支持SCPI控制,要怎么验证命令是否正确?-CSDN博客中我们提到SCPI命令的历史。并且提到了关于制造商为控制仪器而使用的命令,除了公共命令外,并没有统一的规则。比如同一位制造商生产的不同型号仪器甚至会采用不同的规则。 如下所示的众多仪器…

【Deepseek 零门槛指南】DeepSeek 教程和常见问题解答 | 大白技术控

粉丝朋友们大家好,我是极客学长。最近一直在玩 DeepSeek,积累了一点经验,用它提高写作的效率挺好用的。 在使用DeepSeek的过程中,也遇到了如下几个问题(相信很多小伙伴也遇到了): DeepSeek 官网卡顿,突然出…

2025年SEO工具有哪些?老品牌SEO工具有哪些

随着2025年互联网的发展和企业线上营销的日益重要,SEO(搜索引擎优化)逐渐成为了提高网站曝光率和流量的重要手段。SEO的工作不仅仅是简单地通过关键词优化和内容发布就能够实现的,它需要依赖一系列专业的SEO工具来帮助分析、监测和…

怎么让DeepSeek自动化写作文案

在数字化时代,内容创作已成为企业争夺用户注意力的核心竞争力。面对海量信息需求,企业往往面临内容创作效率低下、质量参差不齐、周期长等问题。如何用技术手段解决这些痛点,成为企业迫切需要破解的难题。今天,我们将以DeepSeek为…

【vue3】实现pdf在线预览的几种方式

今天一天对当前可用的pdf预览插件做了测试,主要需求是只能预览不能下载,但对于前端来说,没有绝对的禁止,这里只罗列实现方式。 目前采用vue3版本为:3.2.37 iframevue-officepdfjs-dist iframe 先说最简单的&#xf…

软件测试之接口测试理论知识

文章目录 前言接口的定义接口的分类 接口测试什么是接口测试接口测试的基本原理为什么要进行接口测试?接口测试的测试范围(测试维度) 接口测试的流程1.需求分析2.接口文档分析接口文档分析要素 3.编写接口测试计划4.编写接口测试用例&评审…