mysql 中位数_Mysql:实现中位数算法

本文介绍了如何在MySQL中通过算法计算中位数,包括单条件和多条件下的中位数。首先创建了一个出租案例表并填充随机数据,然后通过ORDER BY排序,利用变量自增实现新的ID,以获取中位数。同时,文章讨论了使用GROUP_CONCAT和SUBSTRING_INDEX函数组合计算中位数的方法,以及处理大数据量时避免GROUP_CONCAT长度限制的问题。
摘要由CSDN通过智能技术生成

本次文章目的:

Mysql并没有专门的中位数算法,而对于SQL不熟悉的人,书写中位数,只能通过JAVA等语言实现。

并非推荐使用Mysql完成中位数计算,以下实现,仅为了通过算法解析的过程中,了解一些Mysql常用与不常用的功能、函数,并开拓思维。

当然,对于一些临时性的要求,需要制作一些临时性的算法测试、校验、导出, 能使用Mysql完成这类算法,就凸显出其效率。

说到中位数,我们就需要一批数据来进行测试和实现,创建如下表:

DROP TABLE IF EXISTSCaseRent;CREATE TABLECaseRent(

IDint(6) NOT NULLAUTO_INCREMENT,

ResidentialAreaIDint(6) DEFAULT NULL,

CaseFromvarchar(30) DEFAULT NULL,

Priceint(6) DEFAULT NULL,PRIMARY KEY(ID)

);

称之为出租案例表,关键字段有:小区ID、案例来源及价格。

接下来通过随机数来给出租案例表赋值:

INSERT INTOCaseRent (ResidentialAreaID, CaseFrom ,Price)SELECT ROUND((RAND()*100)+1),'链家在线',ROUND((RAND()*8000)+1000)

该语句包含知识点如下:

通过 INSERT INTO ... SELECT 进行赋值(用途广泛,创建表亦可以使用)

运用Rand() 随机数函数,ROUND()四舍五入函数,完成小区ID从0~100,价格从1000~9000的随机录入。

一条数据当然不够,我们可以使劲的多点几下执行,使数据增加到近10条。这时候我们修改一下赋值语句

INSERT INTOCaseRent (ResidentialAreaID, CaseFrom ,Price)SELECT ROUND((RAND()*100)+1),'链家在线',ROUND((RAND()*8000)+1000) FROM CaseRent

继续反复来N下,之后将来源“链家在线”修改为“房天下”,进行一次赋值。

INSERT INTOCaseRent (ResidentialAreaID, CaseFrom ,Price)SELECT ROUND((RAND()*100)+1),'房天下',ROUND((RAND()*8000)+1000) FROM CaseRent

模拟数据到此完成!示例如下:

19585e0024ea7a6f347c4e54dde42f18.png

实际上,网上的中位数花式百出,但无一不是:代码篇幅长、需要自我关联 或者 使用上临时变量。

当然也有类似我们接下来要讲的方式。无论哪种方式,都需要更多的了解和扩展自己所知。

接下来以刚才我们自定义的模拟数据为例子,安排第一个问题:

查找小区ID = 99 的价格中位数

这类的中位数,可以说是最简单的,而且网上大部分中位数,均针对此类中位数(单条件),从上述网站就可以看到,其问题与我们的类似,但其代码量可谓不少。

我们来分析问题:其获取价格中位数,就必须使用ORDER BY 来实现排序,排序后,统计总条数,来获取中间一条的价格作为结果(如果为偶数,可以取2条均值,亦可以取前一条 例如6条数据,可以取第3、4条进行均值计算,这里以取前一条为算法模拟)

<
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值