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

mysql之数据聚合

官方文档

SUM(column)

用于计算指定列的总和。
示例:计算每个部门员工的总工资

SELECT department, SUM(salary) AS total_salary
FROM employees
GROUP BY department;

AVG(column)

用于计算指定列的平均值。
示例:计算每个部门员工的平均工资

SELECT department, AVG(salary) AS avg_salary
FROM employees
GROUP BY department;

COUNT(column)

用于统计指定列中非 NULL 值的个数。
示例:统计每个部门有多少员工

SELECT department, COUNT(employee_id) AS num_employees
FROM employees
GROUP BY department;

COUNT(*)

用于统计总行数。
示例:统计公司总共有多少员工

SELECT COUNT(*) AS total_employees
FROM employees;

MAX(column)

用于返回指定列中的最大值。
示例:找出每个部门工资最高的员工

SELECT e.department, e.name, e.salary
FROM employees e
INNER JOIN (SELECT department, MAX(salary) AS max_salaryFROM employeesGROUP BY department
) t ON e.department = t.department AND e.salary = t.max_salary;

MIN(column)

用于返回指定列中的最小值。
示例:找出每个部门工资最低的员工

SELECT e.department, e.name, e.salary
FROM employees e
INNER JOIN (SELECT department, MIN(salary) AS min_salaryFROM employeesGROUP BY department
) t ON e.department = t.department AND e.salary = t.min_salary;
GROUP_CONCAT(column):

用于将指定列中的值连接起来,形成一个字符串。
示例:列出每个部门所有员工的名字

SELECT department, GROUP_CONCAT(name) AS employees
FROM employees
GROUP BY department;

VAR_POP(column) 和 VAR_SAMP(column)

用于计算总体方差和样本方差。
示例:计算每个部门员工工资的总体方差和样本方差

SELECT department, VAR_POP(salary) AS population_variance,VAR_SAMP(salary) AS sample_variance
FROM employees
GROUP BY department;

STDEV_POP(column) 和 STDEV_SAMP(column)

用于计算总体标准差和样本标准差。
示例:计算每个部门员工工资的总体标准差和样本标准差

SELECTdepartment,SQRT(VAR_POP(salary)) AS population_std_dev,SQRT(VAR_SAMP(salary)) AS sample_std_dev
FROM employees
GROUP BY department;

ROLLUP()

提供分级汇总,可以同时得到小计和总计。
示例:计算每个部门每个职位的总工资,以及每个部门的总工资和整个公司的总工资

SELECTdepartment,job_title,SUM(salary) AS total_salary
FROM employees
GROUP BY ROLLUP(department, job_title);

CUBE()

提供多维度的分组汇总。
示例:计算每个部门每个职位的总工资,以及每个部门的总工资、每个职位的总工资和整个公司的总工资

SELECTdepartment,job_title,SUM(salary) AS total_salary
FROM employees
GROUP BY CUBE(department, job_title);

窗口函数

窗口函数之所以被称为"窗口函数",是因为它们的工作方式类似于在数据集上滑动一个"窗口",并对该窗口内的行进行计算。

这里的"窗口"指的是一组行,这组行被用作计算的基础。窗口函数会为每行数据计算一个值,这个值是基于该行所在的窗口中的其他行计算得出的。

与聚合函数(如 SUM、AVG 等)不同,窗口函数不会改变返回行的数量。相反,它们会为每个输入行生成一个输出行,并在该行上添加一个计算值。

窗口函数之所以被称为"窗口"函数,是因为它们通过在数据集上滑动一个"窗口"来计算结果。这个"窗口"可以是基于某些条件(如 PARTITION BY 子句)定义的一组行,也可以是整个数据集。

在计算每个部门内员工的工资排名时,我们使用 RANK() 窗口函数。这个函数会为每个员工计算他们在所属部门内的工资排名。在计算每个员工排名时,函数会"窗口"到该员工所属的部门内的其他员工,并根据工资大小进行排序。

窗口函数主要有以下几种:

ROW_NUMBER()

为每个分组内的行记录一个顺序号,序号从 1 开始,且不会因为值的相等而重复。

RANK()

为每个分组内的行记录一个排名,如果有并列,则会留下空位。

DENSE_RANK()

为每个分组内的行记录一个排名,如果有并列,则不会留下空位。

NTILE(n)

将分组数据划分为 n 个等sized 窗格,记录每条数据所在的窗格编号。

LEAD(column, [offset], [default_value])

用于获取当前行往下偏移 offset 行的值,如果数据不存在则使用 default_value。

LAG(column, [offset], [default_value])

用于获取当前行往上偏移 offset 行的值,如果数据不存在则使用 default_value。

FIRST_VALUE(column)

返回分组内当前行之前的第一个值。

LAST_VALUE(column)

返回分组内当前行之后的最后一个值。

实例

这些窗口函数通常与 OVER 子句一起使用,用于对查询结果进行复杂的排序、分组和计算。下面是一个综合运用多个窗口函数的例子:

SELECT department,name,salary,ROW_NUMBER() OVER (PARTITION BY department ORDER BY salary DESC) AS rn,RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS ranking,DENSE_RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS dense_ranking,LEAD(salary, 1, 0) OVER (PARTITION BY department ORDER BY salary DESC) AS next_salary,LAG(salary, 1, 0) OVER (PARTITION BY department ORDER BY salary DESC) AS prev_salary
FROM employees;

这个查询不仅返回了每个员工的基本信息,还计算了他们在所在部门内的排名,以及与前一个和下一个员工工资的差异。窗口函数的灵活性和复杂性为数据分析提供了强大的工具。

partition 和 over

在 MySQL 中,partition 和 over 是两个相关但不同的概念:

Partition

Partition 是一种将表格数据逻辑上划分为多个部分的方法。
通过在 CREATE TABLE 或 ALTER TABLE 语句中指定 PARTITION BY 子句,可以基于某些列将数据划分为多个分区。
分区可以提高查询效率,因为 MySQL 只需要访问相关的分区,而不是整个表格。常见的分区方式包括按月、按年、按范围等。
示例:

CREATE TABLE sales
(id INT,product VARCHAR(50),sales_date DATE
)
PARTITION BY RANGE (YEAR(sales_date))
(PARTITION p2023 VALUES LESS THAN (2024),PARTITION p2024 VALUES LESS THAN (2025),PARTITION p2025 VALUES LESS THAN (2026)
);

Window Functions (OVER)

Window functions 是一类特殊的函数,可以在查询结果中的每一行上执行计算,但不会改变该行的输出。
OVER 子句用于定义窗口函数的范围,指定在哪些行上执行计算。
常见的窗口函数包括 ROW_NUMBER()、RANK()、DENSE_RANK()、SUM()、AVG() 等。
示例:

SELECTid,product,sales_date,sales_amount,SUM(sales_amount) OVER (PARTITION BY product ORDER BY sales_date) AS cumulative_sales
FROMsales;

在这个例子中,SUM(sales_amount) OVER (PARTITION BY product ORDER BY sales_date) 会计算每个产品的累计销售额。PARTITION BY product 指定按产品进行分组,ORDER BY sales_date 指定按销售日期排序。

相关文章:

  • 用python纯手写一个日历
  • 数字化校园:打造未来教育新风尚
  • 每天五分钟深度学习框架pytorch:多维tensor向量在某一维度的拼接和分割
  • 分类预测 | Matlab实现基于Transformer多特征分类预测/故障诊断
  • Allegro光绘Gerber文件、IPC网表、坐标文件、装配PDF文件导出打包
  • 中文大数据训练的数据集
  • C# OpenCvSharp Mat操作-创建Mat-构造函数
  • 什么是中断?STM32F407中断处理
  • 【Android面试八股文】讲一讲String、StringBuffer和StringBuilder在进行字符串操作时候的效率
  • 基于dagger平台实现资源位的接口自动化
  • 力扣hot100:75. 颜色分类(双指针)
  • 数据中台-知识图谱平台
  • Windows系统下使用gvim配置LaTeX快速书写环境
  • idea 启动tomcat后总是弹出框显示cannot open url.please check this url is correct
  • 精准定位,智慧提纯:高级数据提取策略
  • 深入了解以太坊
  • [nginx文档翻译系列] 控制nginx
  • 4. 路由到控制器 - Laravel从零开始教程
  • Cookie 在前端中的实践
  • electron原来这么简单----打包你的react、VUE桌面应用程序
  • JavaScript设计模式之工厂模式
  • Nodejs和JavaWeb协助开发
  • React系列之 Redux 架构模式
  • Swoft 源码剖析 - 代码自动更新机制
  • Vim 折腾记
  • Yii源码解读-服务定位器(Service Locator)
  • 案例分享〡三拾众筹持续交付开发流程支撑创新业务
  • 百度小程序遇到的问题
  • 对象管理器(defineProperty)学习笔记
  • 项目管理碎碎念系列之一:干系人管理
  • 再次简单明了总结flex布局,一看就懂...
  • elasticsearch-head插件安装
  • mysql 慢查询分析工具:pt-query-digest 在mac 上的安装使用 ...
  • 阿里云ACE认证学习知识点梳理
  • ​香农与信息论三大定律
  • ‌U盘闪一下就没了?‌如何有效恢复数据
  • ![CDATA[ ]] 是什么东东
  • ### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
  • #APPINVENTOR学习记录
  • #FPGA(基础知识)
  • (1综述)从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练
  • (Java岗)秋招打卡!一本学历拿下美团、阿里、快手、米哈游offer
  • (LeetCode 49)Anagrams
  • (Redis使用系列) Springboot 实现Redis 同数据源动态切换db 八
  • (附源码)计算机毕业设计SSM疫情社区管理系统
  • (更新)A股上市公司华证ESG评级得分稳健性校验ESG得分年均值中位数(2009-2023年.12)
  • (官网安装) 基于CentOS 7安装MangoDB和MangoDB Shell
  • (九)c52学习之旅-定时器
  • (入门自用)--C++--抽象类--多态原理--虚表--1020
  • (十一)JAVA springboot ssm b2b2c多用户商城系统源码:服务网关Zuul高级篇
  • (学习日记)2024.04.10:UCOSIII第三十八节:事件实验
  • (一)kafka实战——kafka源码编译启动
  • (转)关于pipe()的详细解析
  • .cn根服务器被攻击之后
  • .Net mvc总结