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 求中位数

相关推荐
混乱意志1 小时前
dgraph example数据导入
数据库·后端
Web极客码1 小时前
WordPress 站点漏洞利用:数据库恶意注入与多重感染的案例分析
数据库·wordpress·网站安全·数据库注入·wordpress漏洞·wordpress安全插件
刺客xs1 小时前
MySQL数据库----DML语句
数据库·mysql
嘉讯科技HIS系统1 小时前
嘉讯科技:医疗信息化、数字化、智能化三者之间的关系和区别
大数据·数据库·人工智能·科技·智慧医疗
爱上语文3 小时前
Redis基础(4):Set类型和SortedSet类型
java·数据库·redis·后端
lifallen3 小时前
Paimon vs. HBase:全链路开销对比
java·大数据·数据结构·数据库·算法·flink·hbase
Brookty4 小时前
【MySQL】JDBC编程
java·数据库·后端·学习·mysql·jdbc
先做个垃圾出来………4 小时前
SQL的底层逻辑解析
数据库·sql
码不停蹄的玄黓4 小时前
深入拆解MySQL InnoDB可重复读(RR)隔离级别:MVCC+临键锁如何「锁」住一致性?
数据库·mysql·可重复读
paopaokaka_luck5 小时前
基于SpringBoot+Vue的酒类仓储管理系统
数据库·vue.js·spring boot·后端·小程序