Mysql 中位数计算

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: Mysql 中位数计算

1.数据准备和需求

数据准备:

create table employee
(
    id   int auto_increment primary key comment '编号',
    company varchar(255) comment '公司',
    salary int comment '工资'
);
insert into employee(id, company,salary) values (1,'A',2341);
insert into employee(id, company,salary) values (2,'A',341);
insert into employee(id, company,salary) values (3,'A',15);
insert into employee(id, company,salary) values (4,'A',15314);
insert into employee(id, company,salary) values (5,'A',451);
insert into employee(id, company,salary) values (6,'A',513);
insert into employee(id, company,salary) values (7,'B',15);
insert into employee(id, company,salary) values (8,'B',13);
insert into employee(id, company,salary) values (9,'B',1154);
insert into employee(id, company,salary) values (10,'B',1345);
insert into employee(id, company,salary) values (11,'B',1221);
insert into employee(id, company,salary) values (12,'B',234);
insert into employee(id, company,salary) values (13,'C',2345);
insert into employee(id, company,salary) values (14,'C',2645);
insert into employee(id, company,salary) values (15,'C',2645);
insert into employee(id, company,salary) values (16,'C',2652);
insert into employee(id, company,salary) values (17,'C',65);

计算每个公司工资的中位数,结果如下:

+----+---------+--------+
| id | company | salary |
+----+---------+--------+
|  6 | A       |    513 |
|  5 | A       |    451 |
|  9 | B       |   1154 |
| 12 | B       |    234 |
| 14 | C       |   2645 |
+----+---------+--------+

2.结果实现

思路1:N为奇数,中位数排序编号是(N+1)/2;N为偶数,中位数排序编号是N/2和N/2+1,不管奇偶数就是(N+1)/2向下取整和(N+2)/2向下取整。

select id, company, salary
from
(select id,
       company,
       salary,
        cast(row_number() over (partition by company order by salary,id) as signed) asc_salary,
        count(1) over (partition by company) total_num
from employee) t
where asc_salary in ((total_num+1)/2,total_num/2,total_num/2+1)
-- where asc_salary in (floor((total_num + 1)/2), floor((total_num + 2)/2))
;

思路2:N为奇数,正序排序编号和逆序排序编号相等(相差0),N为偶数,正序排序编号和逆序排序编号互换(相差1);

select id, company, salary
from
(select id,
       company,
       salary,
       cast(row_number() over (partition by company order by salary,id) as signed) asc_salary,
       cast(row_number() over (partition by company order by salary desc,id desc) as signed) desc_salary
from employee) t
where asc_salary = desc_salary or abs(asc_salary-desc_salary) = 1;

思路3:不管奇数和偶数,正序排序编号、逆序排序编号大于等于N/2;

select id, company, salary
from
(select id,
       company,
       salary,
        cast(row_number() over (partition by company order by salary,id) as signed) asc_salary,
        cast(row_number() over (partition by company order by salary desc,id desc) as signed) desc_salary,
        count(1) over (partition by company) total_num
from employee) t
where asc_salary >= total_num/2
and desc_salary >= total_num/2;


思路4:不管数组长度是奇是偶,也不管元素是否唯一,中位数出现的频率一定大于等于 大于它的数与小于它的数的绝对值之差

select min(id) id
       a.company,
       a.salary
from employee as a,
     employee as b
where a.company = b.company
group by a.company, a.salary
having sum(a.salary = b.salary) >= abs(sum(sign(a.salary - b.salary)))

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
6月前
|
存储 关系型数据库 MySQL
MYSQL 单表可以放多少数据是怎么计算出来的
MYSQL 单表可以放多少数据是怎么计算出来的
127 1
|
6月前
|
关系型数据库 MySQL 分布式数据库
PolarDB MySQL版标准版计算节点规格详解
PolarDB MySQL版标准版计算节点规格详解
160 1
|
22天前
|
分布式计算 关系型数据库 MySQL
大数据-88 Spark 集群 案例学习 Spark Scala 案例 SuperWordCount 计算结果数据写入MySQL
大数据-88 Spark 集群 案例学习 Spark Scala 案例 SuperWordCount 计算结果数据写入MySQL
44 3
|
25天前
|
存储 监控 关系型数据库
MySQL计算某条数据与上一条数据的生成时间差
MySQL计算某条数据与上一条数据的生成时间差
33 2
|
4月前
|
关系型数据库 MySQL 数据库
MySQL 保姆级教程(八):创建计算字段
MySQL 保姆级教程(八):创建计算字段
|
5月前
|
分布式计算 大数据 关系型数据库
MaxCompute产品使用问题之mysql读取从mc里的每10分钟计算好的结果数据表,如何同步数据过去
MaxCompute作为一款全面的大数据处理平台,广泛应用于各类大数据分析、数据挖掘、BI及机器学习场景。掌握其核心功能、熟练操作流程、遵循最佳实践,可以帮助用户高效、安全地管理和利用海量数据。以下是一个关于MaxCompute产品使用的合集,涵盖了其核心功能、应用场景、操作流程以及最佳实践等内容。
|
5月前
|
存储 SQL 关系型数据库
MySQL快速回顾:计算字段与函数
MySQL快速回顾:计算字段与函数
|
5月前
|
关系型数据库 MySQL Serverless
【随手记】MySQL窗口函数计算累加和
【随手记】MySQL窗口函数计算累加和
408 0
|
6月前
|
关系型数据库 MySQL Unix
MySQL 计算时间差分钟
【5月更文挑战第3天】
|
SQL 存储 关系型数据库
【MySQL进阶-06】深入理解mysql的内核查询成本计算
【MySQL进阶-06】深入理解mysql的内核查询成本计算
381 0