当前位置: 首页 > news >正文

做网站与网店运营263企业邮箱pop3设置

做网站与网店运营,263企业邮箱pop3设置,网络营销推广主要做什么?,什么网站合适做流量文章目录开窗函数简介为什么使用开窗函数使用开窗函数的经典场景场景1:排名场景2:累计计算场景3:移动平均/移动总计场景4:比较相邻行场景5:计算占比总结开窗函数 简介 SQL的开窗函数是MYSQL在8版本后提供用来简化SQL…

文章目录

  • 开窗函数
    • 简介
    • 为什么使用开窗函数
    • 使用开窗函数的经典场景
      • 场景1:排名
      • 场景2:累计计算
      • 场景3:移动平均/移动总计
      • 场景4:比较相邻行
      • 场景5:计算占比
      • 总结

开窗函数

简介

SQL的开窗函数是MYSQL在8版本后提供用来简化SQL语句的编写的一个方法
标志词是over()
它与我们的聚合函数类似
但是又不一致
聚合函数是在group by会分成几组,会压缩我们原本的数据信息

在这里插入图片描述
而我们的聚合函数可以直接在我们原本的数据行上添加一列我们想知道的信息

select *,avg(sal) over(partition by job) from employee;

avg(sal) over(partition by job) 前一部分是运算的开窗函数,后一部分是进行数据处理的分区
在这里插入图片描述
这个语句是可以使用我们的 聚合函数+子查询进行复现的

SELECT e.*, e1.avg_sal AS "avg(sal) over(partition by job)"
FROM employee e
JOIN (SELECT job, AVG(sal) AS avg_sal FROM employee GROUP BY job
) e1 ON e.job = e1.job;

那下面这条语句就很难简单的去实现了
累加值就是这个日期前的累加在一起
像这种以明细的方式进行累加是我们开窗函数的典型应用场景
!!!

sum(sal) over (partition by dname order by hiredate desc)
解释一下:就是按照dname进行分区嘛,然后分区里面根据hiredate 倒序排序
重要的是sum(sal)只会计算你当前和前面的累加数据,相当于是一个过程
而不是直接将所有工资一sum()就赋值给每个数据了

在这里插入图片描述

为什么使用开窗函数

在这里插入图片描述

使用开窗函数的经典场景

场景1:排名

需求:对员工按工资进行排名,展示不同排名函数的区别。
假设员工表employees只有三个字段:id(员工ID)、name(姓名)、salary(工资)。数据如下:

idnamesalary
1Alice8000
2Bob7000
3Carol9000
4David7000
5Eve8500
SELECT id, name, salary,ROW_NUMBER() OVER (ORDER BY salary DESC) AS row_number_rank,RANK() OVER (ORDER BY salary DESC) AS rank,DENSE_RANK() OVER (ORDER BY salary DESC) AS dense_rank
FROM employees;

结果

idnamesalaryrow_number_rankrankdense_rank
3Carol9000111
5Eve8500222
1Alice8000333
2Bob7000444
4David7000544
  • 注意:这里Bob和David工资相同,但row_number强制给了不同序号
  • 因为Bob和David并列第4名(rank=4),所以下一个rank跳到了6(如果有下一个),但dense_rank接着是5

排名函数区别

  • ROW_NUMBER():无论值是否相同,都按顺序分配唯一的连续整数(1,2,3,…)。
  • RANK():相同值的行排名相同,但会跳过并列占用的名次。例如:1,2,2,4(两个并列第二后,下一个是第四名)。
  • DENSE_RANK():相同值的行排名相同,且排名数字连续。例如:1,2,2,3(两个并列第二后,下一个是第三名)。

场景2:累计计算

需求:计算每个月的销售额累计值。
假设销售表sales只有两个字段:month(月份,格式为’YYYY-MM’)、amount(销售额)。数据如下:

monthamount
2023-011000
2023-021500
2023-031200
SELECT month, amount,SUM(amount) OVER (ORDER BY month) AS cumulative_amount
FROM sales;

结果

monthamountcumulative_amount说明
2023-0110001000
2023-0215002500(1000+1500)
2023-0312003700(1000+1500+1200)

说明:默认的窗口范围是从分区第一行到当前行(ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW),所以是累计计算。

场景3:移动平均/移动总计

需求:计算3个月的移动平均销售额和移动总计。
使用与场景2相同的销售表。

SELECT month, amount,AVG(amount) OVER (ORDER BY monthROWS BETWEEN 2 PRECEDING AND CURRENT ROW) AS moving_avg,SUM(amount) OVER (ORDER BY monthROWS BETWEEN 2 PRECEDING AND CURRENT ROW) AS moving_sum
FROM sales;

结果

monthamountmoving_avgmoving_sum说明
2023-0110001000.00001000– 只有当前行
2023-0215001250.00002500– 前1行+当前行(1000+1500)
2023-0312001233.33333700– 前2行+当前行(1000+1500+1200)
2023-0418001500.00004500– (1500+1200+1800) 注意:这里假设有4月数据

说明:通过ROWS BETWEEN 2 PRECEDING AND CURRENT ROW定义了窗口为当前行及其前两行(共3行)。移动平均和移动总计都是基于这个窗口计算。

场景4:比较相邻行

需求:计算本月销售额相比上月的增长额和增长率。
使用与场景2相同的销售表。

SELECT month, amount,LAG(amount) OVER (ORDER BY month) AS prev_amount,amount - LAG(amount) OVER (ORDER BY month) AS growth_amount,ROUND((amount - LAG(amount) OVER (ORDER BY month)) / LAG(amount) OVER (ORDER BY month) * 100, 2) AS growth_rate_percent
FROM sales;

结果

monthamountprev_amountgrowth_amountgrowth_rate_percent说明
2023-011000NULLNULLNULL
2023-021500100050050.00– (1500-1000)/1000*100 = 50%
2023-0312001500-300-20.00– (1200-1500)/1500*100 = -20%

说明

  • LAG(column, n):获取当前行向前数第n行的值(默认为1,即上一行)。
  • 第一行没有上一行,所以返回NULL。
  • 通过当前值减去上一行的值,可以得到增长额;再除以上一行的值,可以得到增长率。

场景5:计算占比

需求:计算每个员工工资占部门总工资的比例。
假设员工表employees有字段:id(员工ID)、name(姓名)、dept(部门)、salary(工资)。数据如下:

idnamedeptsalary
1AliceIT8000
2BobIT7000
3CarolHR9000
SELECT id, name, dept, salary,salary / SUM(salary) OVER (PARTITION BY dept) * 100 AS dept_salary_percent
FROM employees;

结果

idnamedeptsalarydept_salary_percent说明
1AliceIT800053.33– 8000/(8000+7000)=53.33%
2BobIT700046.67– 7000/(8000+7000)=46.67%
3CarolHR9000100.00– 9000/9000=100%

说明:在窗口函数中,SUM(salary) OVER (PARTITION BY dept)计算每个部门的总工资。然后每个员工的工资除以部门总工资,得到该员工工资在部门中的占比。

总结

以上5个场景覆盖了开窗函数最常用的应用,每个例子都尽量精简字段,并详细解释了关键细节。开窗函数的核心在于通过OVER子句定义窗口(分区和排序),结合不同的窗口函数(如ROW_NUMBER, RANK, DENSE_RANK, SUM, AVG, LAG等)实现复杂的分析计算。

http://www.dtcms.com/a/507902.html

相关文章:

  • 解释 Python 的 GIL(全局解释器锁)机制及其对多线程的影响。
  • Conda_bashrc 初始化机制学习笔记
  • 用dw制作购物网站首页WordPress空间换到万网
  • Spring 4.0新特性全面解析
  • 世界之窗附近做网站公司门户网站的营销特点
  • neo4j密码忘记如何解决
  • React + TypeScript 企业级编码规范指南
  • React Router 路由模式详解:HashRouter vs BrowserRouter
  • 福田做网站怎么样下载网站模板
  • 每日一个C语言知识:C 结构体
  • 淘宝网中国站电脑版登录辽宁省建设工程招投标
  • sql数据库语法
  • 使用jmeter进行压力测试
  • 长期网站外包wordpress主题php详解
  • 面试八股 快速讲解 集合类中的 fail-fast和fail-safe
  • MySQL K8S日志分析与数据还原
  • RK3588 RKLLM大语言模型AI开发环境搭建及板端部署
  • Android Studio配置指南:Gradle 安装
  • php能做手机网站吗网站开发 例子
  • 【完整源码+数据集+部署教程】【零售和消费品&存货】快递包裹条形码与二维码识别系统源码&数据集全套:改进yolo11-RFCBAMConv
  • 泉州seo建站wordpress 生成 应用
  • BearPi小熊派 鸿蒙开发入门笔记(3)
  • 欧几里得算法(Euclidean Algorithm):求最大公约数的经典方法
  • MLLM技术报告 核心创新一览
  • C++设计模式_行为型模式_策略模式Strategy
  • **发散创新:多智能体系统的探索与实践**随着人工智能技术的飞速发展,多智能体系统作为当今研究的热点领域,正受到越来越多关注
  • 音乐网站设计企业网络搭建与应用
  • Flink Data Sink 理论 、架构、语义保证、两阶段提交与可插拔拓扑
  • DeviceNet转Ethernet/IP食品饮料包装线码垛机器人高效通信方案
  • 《基于分布式多模态传感模块的全身尺度机器人皮肤:设计、评估与应用》TR-O 2025论文解析