本次文章目的:
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
模拟数据到此完成!示例如下:
实际上,网上的中位数花式百出,但无一不是:代码篇幅长、需要自我关联 或者 使用上临时变量。
当然也有类似我们接下来要讲的方式。无论哪种方式,都需要更多的了解和扩展自己所知。
接下来以刚才我们自定义的模拟数据为例子,安排第一个问题:
查找小区ID = 99 的价格中位数
这类的中位数,可以说是最简单的,而且网上大部分中位数,均针对此类中位数(单条件),从上述网站就可以看到,其问题与我们的类似,但其代码量可谓不少。
我们来分析问题:其获取价格中位数,就必须使用ORDER BY 来实现排序,排序后,统计总条数,来获取中间一条的价格作为结果(如果为偶数,可以取2条均值,亦可以取前一条 例如6条数据,可以取第3、4条进行均值计算,这里以取前一条为算法模拟)
<