sql求中位数

sql求解中位数

  • [1. 窗口函数:根据中位数的位置信息进行求解](#1. 窗口函数:根据中位数的位置信息进行求解)
  • [2. 中位数,正排倒排都是中位数](#2. 中位数,正排倒排都是中位数)

中位数是指有序数列中,位于 中间位置 的数的值
若为奇数,则中间数开始位置=结束位置
若为偶数,则中位数结束位置-开始位置=1
即
求解公司员工薪水的中位数

sql 复制代码
select  com_id, floor((count(salary)+1)/2) as start,
floor((count(salary)+2)/2) as end
from employee group by com_id order by com_id

1. 窗口函数:根据中位数的位置信息进行求解

  • 分奇偶条件判断
sql 复制代码
select com_id,salary
from
	(
	select com_id,
	salary,
	row_number() over(partition by com_id order by salary desc) as rnk,
	count(salary) over(partition by com_id) as num
	from employee 
	) t1
where t1.rnk in (floor(num/2)+1, if(mod(num,2)=0,floor(num/2),floor(num/2)+1)
order by com_id
  • 中位数条件由排序和总和计算
sql 复制代码
select com_id, salary
from
(
	select com_id,salary,
	row_number() over(partition by com_id order by salary Desc) rnk,
	count(salary) over(partition by com_id) as num
	from employee
) t1
where abs(t1.rnk - (t1.num+1)/2) < 1
order by com_id

注意:不可在一次查询中对窗口函数的结果进行操作

因为查询的顺序为:from->where->group by->having->select->order by

2. 中位数,正排倒排都是中位数

sql 复制代码
select com_id,salary
from
(
	select *,
	row_number() over(partition by com_id order by salary) as rnk1,
	row_number() over(partition by com_id order by salary desc) as rnk2
	from employee
) t1
where rnk1=rnk2 or abs(rnk1-rnk2)=1
order by com_id

报错:BIGINT UNSIGNED value is out of range

两种方式修改:

直接修改设置SET sql_mode='NO_UNSIGNED_SUBTRACTION'

或者修改代码

sql 复制代码
select com_id,salary
from
(
	select *,
	row_number() over(partition by com_id order by salary) as rnk1,
	row_number() over(partition by com_id order by salary desc) as rnk2
	from employee
) t1
where t1.rnk1 = t1.rnk2 or abs(cast(t1.rnk1 as signed)-cast(t1.rnk2 as signed)) = 1

ref:SQL 求中位数

相关推荐
catoop4 小时前
API Key 设计与安全生成方案:结构拆解、数据库设计与 Java 实现
java·数据库·安全
Web极客码4 小时前
我用 Claude 分析 Redis 哨兵日志,实现跨机房数据不一致自动对齐
数据库·redis·php
库库的数据库笔记4 小时前
国产信创数据库的MySQL兼容性深度对比解析
大数据·数据库·mysql·oceanbase·政务
姚远Oracle ACE5 小时前
为什么无法连接到 PostgreSQL?
数据库·postgresql
ss2735 小时前
AI时代首先数据库-PostgreSQL实战笔记 | 22 PostgreSQL实例与集群
数据库·笔记·postgresql
ss2735 小时前
AI时代首先数据库-PostgreSQL实战笔记 | 21 PostgreSQL进程与内存架构介绍
数据库·笔记·postgresql
Henry-SAP7 小时前
SAP PP模块全景概览
数据库
喜欢吃豆7 小时前
Better Auth 深度解析:从用户认证到企业级身份基础设施
数据库·架构·权限·多租户
其实防守也摸鱼7 小时前
Cylab在线靶场——CTF中的通用技能
linux·数据库·学习·算法·靶场·ctf·学习网络安全