当前位置:网站首页>选出表中的中位数记录[构造左右边界 || 问题转换]
选出表中的中位数记录[构造左右边界 || 问题转换]
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的,抽象的看待问题。
参考文献
边栏推荐
- xxl-job 实现email发送警告的代码解析(一行一行代码解读)
- Oracle 脚本实现简单的审计功能
- Big guy, who is free to help me to see what the problem is, I just read MySQL source print, and I just came into contact with flink.
- Weekly recommended short video: In order to fill the gap of learning resources, the author specially wrote a book?
- 域名抢注“卷”到了表情包?ENS逆势上涨的新推力
- 动态接口比例性能测试实践
- 三丁基-巯基膦烷「tBuBrettPhos Pd(allyl)」OTf),1798782-17-8
- 【汇编语言03】第2章 寄存器——实验1:查看CPU和内存,用机器指令和汇编指令编程
- AI智能剪辑,仅需2秒一键提取精彩片段
- InnoDB 中不同SQL语句设置的锁
猜你喜欢
高等数学---第十章无穷级数---常数项级数
MySQL如何一劳永逸的永久支持输入中文
Atomic Wallet已支持TRC20-USDT
WEB 渗透之RCE
online 方式创建索引触发trigger怎么办?
细胞不可渗透的荧光探针 锌离子荧光探针Zinquin 151606-29-0
Uniswap或将开启“费用开关”,UNI持有者可享受分红
Weekly recommended short video: In order to fill the gap of learning resources, the author specially wrote a book?
yaml data format
实时渲染器不止lumion,Chaos Vantage你值得一试
随机推荐
87. (Home of cesium) cesium heat map (topography)
MySQL 啥时候用表锁,啥时候用行锁?这些你都应该知道吧
SQL代码需要供其他人复用,为什么传统的复制代码不可靠?
With the help of Kubernetes kubekey speed installation
高数---级数
大佬们,flinkcdc 2.2 版本采集sqlserver只能采集到全量的数据,不能采集到增量的数
基于ck+redash构建MySQL慢日志+审计日志展示平台
InnoDB 中不同SQL语句设置的锁
Bytes to beat three sides take offer: network + GC + + IO + redis + JVM red-black tree + data structure, to help you quickly into the giant!!!!!
异常与智能指针
Oracle 脚本实现简单的审计功能
智能合约安全——delegatecall (2)
PHP基础笔记-NO.1
BigInteger :new BigInteger(tokenJson.getBytes()).toString(16)什么意思
WEB 渗透之SSRF
15、学习MySQL NULL 值处理
【Django-Docker】Sqlite3.db读取权限不够-20220803
你想知道的 Watch App 开发
实现博客营销有哪些技巧
Install porterLB