Mysql 中位数计算

本文涉及的产品
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
简介: 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)))

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
存储 关系型数据库 MySQL
MYSQL 单表可以放多少数据是怎么计算出来的
MYSQL 单表可以放多少数据是怎么计算出来的
597 2
|
关系型数据库 MySQL 分布式数据库
PolarDB MySQL版标准版计算节点规格详解
PolarDB MySQL版标准版计算节点规格详解
278 1
|
分布式计算 关系型数据库 MySQL
大数据-88 Spark 集群 案例学习 Spark Scala 案例 SuperWordCount 计算结果数据写入MySQL
大数据-88 Spark 集群 案例学习 Spark Scala 案例 SuperWordCount 计算结果数据写入MySQL
161 3
|
存储 监控 关系型数据库
MySQL计算某条数据与上一条数据的生成时间差
MySQL计算某条数据与上一条数据的生成时间差
314 2
|
SQL 存储 关系型数据库
【MySQL进阶-06】深入理解mysql的内核查询成本计算
【MySQL进阶-06】深入理解mysql的内核查询成本计算
984 0
|
关系型数据库 MySQL 数据库
MySQL 保姆级教程(八):创建计算字段
MySQL 保姆级教程(八):创建计算字段
|
关系型数据库 MySQL Unix
MySQL 计算时间差分钟
【5月更文挑战第3天】
1144 2
|
分布式计算 大数据 关系型数据库
MaxCompute产品使用问题之mysql读取从mc里的每10分钟计算好的结果数据表,如何同步数据过去
MaxCompute作为一款全面的大数据处理平台,广泛应用于各类大数据分析、数据挖掘、BI及机器学习场景。掌握其核心功能、熟练操作流程、遵循最佳实践,可以帮助用户高效、安全地管理和利用海量数据。以下是一个关于MaxCompute产品使用的合集,涵盖了其核心功能、应用场景、操作流程以及最佳实践等内容。
156 0
|
存储 SQL 关系型数据库
MySQL快速回顾:计算字段与函数
MySQL快速回顾:计算字段与函数
|
关系型数据库 MySQL Serverless
【随手记】MySQL窗口函数计算累加和
【随手记】MySQL窗口函数计算累加和
984 0

推荐镜像

更多