当前位置:网站首页>选出表中的中位数记录[构造左右边界 || 问题转换]
选出表中的中位数记录[构造左右边界 || 问题转换]
2022-08-03 18:28:00 【REN_林森】
中位数问题
前言
对于选表中的中位数记录,或者说中位数落在了那一块记录,该如何解?可构造左右边界 || 问题转换(正序累计&反序累计都大于中值时该记录为中位数记录)。
一、中位数问题

二、构造边界 & 问题转换
分两类思想,一类构造左右边界 & 中值;一类问题转化,反向思考,当正序累计 & 逆序累计都大于中值时,则为中位数。
解1:两层view + lead()构造左右边界
with view4base as(
select
grade,
sum(number) over(order by grade) `right`,
sum(number) over() total
from class_grade
),view4lead as(
select
grade,total,
lead(`right` + 1,1) over(order by `right` desc) `left`,`right`
from view4base
)
select grade
from view4lead
where (total >> 1) + 1 >= `left` and (total >> 1) + 1 <= `right`
or total & 1 = 0 and (total >> 1) >= `left` and (total>>1) <= `right`
order by grade
解2:直接做运算得到想要的值–左边界。
with view4base as(
select
grade,
sum(number) over(order by grade) - number `left`,
sum(number) over(order by grade) + 1 `right`,
sum(number) over() total
from class_grade
)
select grade
from view4base
where (total >> 1) + 1 > `left` and (total >> 1) + 1 < `right`
or total & 1 = 0 and (total >> 1) > `left` and (total >> 1) < `right`
order by grade
解3:中位数:n + 1 / 2 和 n / 2 + 1
with view4base as(
select
grade,
sum(number) over(order by grade) - number `left`,
sum(number) over(order by grade) + 1 `right`,
# 中位数:n + 1 / 2 和 n / 2 + 1
sum(number) over() + 1 >> 1 mid1,
(sum(number) over() >> 1) + 1 mid2
from class_grade
)
select grade
from view4base
where mid1 > `left` and mid1 < `right` or mid2 > `left` and mid2 < `right`
order by grade
解4:当一个数正序 & 逆序累计都大于等于中值时(非取整,保留0.5),这个数为中位数。
with view4base as(
select
grade,
sum(number) over(order by grade) m,
sum(number) over(order by grade desc) n,
sum(number) over() / 2 mid
from class_grade
)
select grade
from view4base
where m >= mid and n >= mid
order by grade
总结
1)中位数问题思路,构造左右边界 & 问题转换。
2)抽象能力很重要,不管是聚集函数/窗口函数/内置函数,入参&结果不过可看成一个值,再上面做四则运算/函数等都是OK的,抽象的看待问题。
参考文献
边栏推荐
- OSError: [WinError 123] 文件名、目录名或卷标语法不正确
- Weekly recommended short video: In order to fill the gap of learning resources, the author specially wrote a book?
- LyScript 内存交换与差异对比
- dd命令:用于读取、转换并输出数据
- 架构基本概念和架构本质
- cdc抽取mysql整个实例的binlog,有没有方案通过配置的方式将这些库表拆开分发到kafka
- 【mysql】SIGN(x) function
- 2021年数据泄露成本报告解读
- Intelligent security contract - delegatecall (2)
- How does MySQL permanently support Chinese input once and for all?
猜你喜欢
随机推荐
es6新增-Generator(异步编程的解决方案2)
online 方式创建索引触发trigger怎么办?
Jenkins CI平台(二)
学弟:我适不适合转行做软件测试?
cocos creater 3.x 插件安装方法
2022年7月国产数据库大事记
大佬,谁有空帮忙看下这个什么问题呢,我就读取MySQLsource print下,刚接触flink,
使用安全浏览器将网页保存为pdf的方法步骤
es6新增-async函数(异步编程的最终解决方案)
2021年数据泄露成本报告解读
Flask框架——项目可安装化
MVCC多版本并发控制的理解
你想知道的 Watch App 开发
货比四家 version tb1.63
快手通过国际权威信息安全和隐私保护认证,安全能力达到国际领先水平
深度学习常用公式与命令总结(更新中)
Execution plan of mysql
Cyanine5.5 alkyne|Cy5.5 alkyne|1628790-37-3|Cy5.5-ALK
Mkke:为什么无法从Oracle 11g或12c升级到Oracle 23c?
[笔记]机器学习之前言介绍









