COUNT(*) OVER (PARTITION BY ...)窗口函数——在每一行上执行聚合操作

news2025/2/22 18:44:09

它用于在查询结果中执行聚合操作,而不会影响查询的分组行数,同时在每个分组内进行计数。

  • COUNT(): 这表示要计算在窗口内的行数, 代表计算所有行。
  • OVER: 这引入了窗口函数的定义,它告诉数据库引擎在什么样的窗口内执行计数。
  • (PARTITION BY …): 这部分定义了窗口的分区方式,即如何将数据划分为不同的分组。PARTITION BY
    子句指定一个或多个列,根据这些列的值将数据划分为不同的窗口。

看个问题

编写一个 SQL 语句,将某个员工与具有相同许可证的所有其他员工进行匹配。
在这里插入图片描述
输出的结果为:
在这里插入图片描述

  • 员工 ID 1001 和 2002 将在预期输出中,因为它们都带有 A 类、B 类和C 类许可证。
  • 员工 ID 4004 和 5005 将在预期输出中,因为它们都带有 A 类、B 类和 D类许可证。
  • 尽管员工 ID 3003 与员工 ID 4004 和 5005 具有相同的许可证,但这些员工 ID没有与 3003 相同的许可证。

表和数据

DROP TABLE IF EXISTS #Employees;
GO

CREATE TABLE #Employees
(
EmployeeID  INTEGER,
License     VARCHAR(100),
PRIMARY KEY (EmployeeID, License)
);
GO

INSERT INTO #Employees (EmployeeID, License) VALUES
(1001,'Class A'),(1001,'Class B'),(1001,'Class C'),
(2002,'Class A'),(2002,'Class B'),(2002,'Class C'),
(3003,'Class A'),(3003,'Class D'),
(4004,'Class A'),(4004,'Class B'),(4004,'Class D'),
(5005,'Class A'),(5005,'Class B'),(5005,'Class D');
GO

咋写?

1.要全部都匹配上
2.要计算出数量

如果直接用自己关联(#Employees A inner join #Employees B
on A.License=B.License and A.EmployeeID<>B.EmployeeID
group by A.EmployeeID,B.EmployeeID)就是只计算匹配上的个数,没有都匹配上,且没匹配总数量,那要怎么既单个都匹配上且总数也对的上呢?有什么函数是可以显示单个和总数的之间的关系?
就要用到COUNT(*) OVER (PARTITION BY …)窗口函数
每行都显示出匹配上的总数,这样就不用再group by算一遍总数再匹配,省了很多的时间。
在这里插入图片描述

结果

WITH cte_Count as--为了匹配许可证数量
(
SELECT  EmployeeID,
        COUNT(*) AS LicenseCount
FROM    #Employees
GROUP BY EmployeeID
),
cte_CountWindow as--为了获取许可证数量
(
SELECT  a.EmployeeID AS EmployeeID_A,
        b.EmployeeID AS EmployeeID_B,
        COUNT(*) OVER (PARTITION BY a.EmployeeID, b.EmployeeID) AS CountWindow
FROM    #Employees a CROSS JOIN
        #Employees b
WHERE   a.EmployeeID <> b.EmployeeID and a.License = b.License
)
SELECT  DISTINCT
        a.EmployeeID_A,
        a.EmployeeID_B,
        a.CountWindow AS LicenseCount
FROM    cte_CountWindow a 
	    inner join cte_Count b ON a.CountWindow = b.LicenseCount --总数量匹配上
								  and a.EmployeeID_A = b.EmployeeID --人
		inner join cte_Count c ON a.CountWindow = c.LicenseCount 
								  and a.EmployeeID_B = c.EmployeeID;

COUNT(*) OVER (PARTITION BY …)显示了分组后的每行数据与总的数据的关系,利用这个关系,可以匹配上总数一致。

应用场景

COUNT(*) OVER (PARTITION BY …) 通常应用于窗口函数中,用于分析和报告需要在结果集中的每行上执行聚合操作的场景。以下是一些常见的应用场景:

  • 计算每组的行数:窗口函数允许你在结果集中的每一行上计算分组内的行数,而不需要使用 GROUP BY子句。这对于需要在保持所有行的情况下查看每个分组的大小的情况非常有用。
  • 计算累积和或平均值:你可以使用窗口函数来计算每一行的累积和、平均值或其他聚合指标,而不必创建中间结果或更改结果集的结构。
  • 识别排名和百分比:窗口函数允许你为每一行计算排名或百分比,例如,找出每个销售员的销售额在总销售额中的百分比。
  • 查找首次出现或最后出现的事件:你可以使用窗口函数来确定每组内首次或最后一次出现某个事件的时间戳或行。
  • 分析前后行:你可以使用窗口函数来分析前一行和后一行的数据,例如,计算每个时间点的收益与前一个时间点的差异。
  • 分组内数据分布分析:窗口函数可用于查找每组内数据的分布情况,如查找每组内的最大、最小值,或者计算分位数。
  • 复杂的累积计算:在某些情况下,你可能需要执行复杂的累积计算,包括多次计算和分组。窗口函数可以帮助你处理这些需求,而不必使用复杂的子查询或连接。

总之,窗口函数允许你在结果集的每一行上执行聚合操作,而不会减少结果集的行数,从而提供了更灵活和强大的数据分析工具。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

系列十三、Redis的哨兵机制

一、概述 Sentinel&#xff08;哨兵&#xff09;是Redis的高可用解决方案&#xff0c;由一个或者多个Sentinel实例组成集群&#xff0c;可以监视任意多个主服务器&#xff0c;以及这些服务器下属的所有从服务器&#xff0c;并在被监视的主服务器下线或者宕机时&#xff0c;自动…

python输出小数控制的方法

大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 如果有什么疑惑/资料需要的可以点击文章末尾名片领取源码 一、要求较小的精度 将精度高的浮点数转换成精度低的浮点数。 1.round()内置方法 round()不是简单的四舍五入的处理方式。 >>> round(2.5) 2 >>> ro…

AD9371 官方例程HDL详解之JESD204B TX侧时钟生成 (二)

AD9371 系列快速入口 AD9371ZCU102 移植到 ZCU106 &#xff1a; AD9371 官方例程构建及单音信号收发 ad9371_tx_jesd -->util_ad9371_xcvr接口映射&#xff1a; AD9371 官方例程之 tx_jesd 与 xcvr接口映射 AD9371 官方例程 时钟间的关系与生成 &#xff1a; AD9371 官方…

Promise笔记-同步回调-异步回调-JS中的异常error处理-Promis的理解和使用-基本使用-链式调用-七个关键问题

Promise笔记 1. 预备知识1.1 实例对象与函数对象1.2 两种类型的回调函数1. 同步回调2. 异步回调 1.3 JS中的异常error处理1. 错误的类型2. 错误处理&#xff08;捕获与抛出&#xff09;3. 错误对象 2.Promise的理解和使用2.1 Promise是什么1.理解Promise2.Promise 的状态3. Pro…

一种融合偶然和认知不确定性的贝叶斯深度学习RUL框架

_原文&#xff1a; _《《A Bayesian Deep Learning RUL Framework Integrating Epistemic and Aleatoric Uncertainties》 _作者__&#xff1a; _Gaoyang Lia&#xff0c;Li Yangb&#xff0c;Chi-Guhn Leec&#xff0c;Xiaohua Wangd&#xff0c;Mingzhe Ronge _作者单位&am…

selenium元素定位之xpath

一、找父级节点parent xpath&#xff1a;//span[text()保存]/parent::button 说明&#xff1a;先找到span标签&#xff0c;再找到父级button 一、找同级的上方标签preceding-sibling xpath&#xff1a;//span[text()保存]/parent::button/preceding-sibling::button[1] 说明…

找不到mfc140u.dll无法继续执行此代码的5个修复方法分享

是使用计算机的过程中&#xff0c;我们经常会遇到各种各样问题&#xff0c;其中丢失“mfc140u dll”&#xff08;动态链接库&#xff09;是最常见的一种。DLL文件是一种可在多个程序之间共享的代码库&#xff0c;它可以被应用程序在运行时动态加载和卸载。而“mfc140u dll”则是…

Flink实时写入Apache Doris如何保证高吞吐和低延迟

随着实时分析需求的不断增加,数据的时效性对于企业的精细化运营越来越重要。借助海量数据,实时数仓在有效挖掘有价值信息、快速获取数据反馈、帮助企业更快决策、更好的产品迭代等方面发挥着不可替代的作用。 在这种情况下,Apache Doris 作为一个实时 MPP 分析数据库脱颖而出,…

小程序开发——小程序的视图与渲染

1.视图与渲染过程 基本概念&#xff1a; 视图层由WXML页面文件和样式文件WXSS共同组成。事件是视图层和逻辑层沟通的纽带&#xff0c;用户操作触发事件后可通过同名的事件处理函数执行相应的逻辑&#xff0c;处理完成后&#xff0c;更新的数据又将再次渲染到页面上。 WXML页面…

通过流量安全分析发现主机异常

主机异常分析在计算机系统中具有重要意义。以下是主机异常分析的几个关键点&#xff1a; 1、检测安全威胁&#xff1a;主机是计算机系统的核心组件&#xff0c;通过对主机异常进行分析&#xff0c;可以快速检测到潜在的安全威胁&#xff0c;如恶意软件、病毒感染、黑客入侵等。…

python中可变类型与不可变类型详细介绍

嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 一.可变类型与不可变类型的特点 1.不可变数据类型 不可变数据类型在第一次声明赋值声明的时候, 会在内存中开辟一块空间, 用来存放这个变量被赋的值, 而这个变量实际上存储的, 并不是被赋予的这个值, 而是存放这个值所在空…

Python获取本机IP地址的三种方式

目录 1、使用专用网址 2、使用自带socket库 3、使用第三方netifaces库 1、使用专用网站 获取的是公网IP。 网址&#xff1a;http://myip.ipip.net 代码&#xff1a; import requestsres requests.get(https://myip.ipip.net, timeout5).textprint(res)具体可以类似这样&#x…

IP-guard客户端WINDOWS的打包方式

IP-guard的打包方式: 第一种:

Bootstrap的旋转器组件

旋转效果可以用来指示状态&#xff0c;比如页面的加载状态。 可以用类spinner-border实现普通旋转的旋转器效果。 用类spinner-grow实现渐渐变大的旋转器效果。 01-最基本的示例代码 <!DOCTYPE html> <html> <head><meta charset"UTF-8">…

Python树莓派开发

欢迎关注博主 Mindtechnist 或加入【智能科技社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和技术。关…

鞋帽箱包经营小程序商城的作用是什么

线上是很多线下商家破局的方法&#xff0c;企业私域经营很重要。 如今&#xff0c;各行业都在搭建自有私域流量池及自主经营。1000商城模板&#xff0c;海量营销/功能/控件&#xff0c;极简的拖拽拉搭建形式&#xff0c;通过【雨科】平台搭建鞋帽箱包小程序商城&#xff0c;摆…

qwen大模型,推理速度慢,单卡/双卡速度慢,flash-attention安装,解决方案

场景 阿里的通义千问qwen大模型&#xff0c;推理速度慢&#xff0c;单卡/双卡速度慢。 详细&#xff1a; 1、今日在使用qwen-14b的float16版本进行推理&#xff08;BF16/FP16) 1.1 在qwen-14b-int4也会有同样的现象 2、使用3090 24G显卡两张 3、模型加载的device是auto&#x…

测试老鸟总结,Allure测试报告-自动化测试详解,惊险避坑...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、Allure安装教程…

hello react

react中文官网 一、什么是react React是一个由Facebook开源的JavaScript库&#xff0c;用于构建用户界面。它基于组件化的思想&#xff0c;将界面拆分成多个独立的、可复用的组件&#xff0c;并通过组件之间的交互构建整个用户界面。React使用虚拟DOM&#xff08;Virtual DOM…

线框图软件:Balsamiq Wireframes mac中文介绍

Balsamiq Wireframes mac是一款用于创建线框图的软件工具。它旨在帮助用户快速制作出清晰、简洁的界面原型&#xff0c;以便在设计和开发过程中进行协作和沟通。 Balsamiq Wireframes具有简单直观的用户界面&#xff0c;使用户能够快速添加和编辑各种用户界面元素&#xff0c;如…