英文原文:How to calculate median value in MySQL using a *** SQL query
数值型数组的中位数是在数据排序后位于数组两头项的值。假如数组有偶数个元素,中位数就是最两头的两个数值的均匀数。
中位数关于了解“我的值能否位于两头?”十分有效。比方,我在黉舍的最初一次测验中得了 D (或 80),那末我的在全班同窗中的排名能否在前 50%?
举一个详细的例子,我们看看从黉舍的这些测试分数中找到中位数的进程:[55, 80, 95, 100, 99, 70, 60]。
起首,对数组排序:[55, 80, 95, 100, 99, 70, 60] ===> [55, 60, 70, 80, 95, 99, 100].
这个数组包括 7 个元素,不是偶数,所以中位数是 (7 / 2 + 1),即第 4 项的值 => 80。
很不幸,MySQL 并未内置盘算列数据中位数的函数。因而,我们需求本人创立查询。
假设我们想从“grades”列中查找中位数。来看看我们要创立的查询是甚么算法:
对“grades”排序并为排序后的每行附加序号(行号)
假如总行数是奇数,找到位于有序列表两头地位的值。
假如总行数是偶数,找到位于有序列表两头两个地位的值。
盘算上面第 (3) 步和第 (4) 获得值的均匀值。
前往这个均匀值,它就是中位数。
那末如许的查询该怎样写?
SET @rownum := -1; SELECT AVG(g.grade) FROM (SELECT @rowindex:=@rowindex + 1 AS rowindex, grades.grade AS grade FROM grades ORDER BY grades.grade) AS g WHERE t.rowindex IN (FLOOR(@rowindex / 2) , CEIL(@rowindex / 2));
说明一下:
先从外部的一个子查询开端 —— 为 @rowindex 赋值的子查询会为每一个成果付与一个自增后的序号,并对 grades 排序 [译者注:按逻辑和代码是先排序再付与序号]。
有了排好序的成果列表以后,外层查询会获得位两头地位的值。假如数组元素是奇数个,两个值都是取的位于正中阿谁值。
然后,外层查询的 SELECT 子句前往上述两个值的均匀值作为中位数。
你看,这并非容易的运转 MEDIAN(column_name),但它可行。我们等待 MySQL 会决议将这一功用添加到内置产物中,这将简化获得中位数的查询。
本文中的一切译文仅用于进修和交换目标,转载请务必注明文章译者、出处、和本文链接。 2KB翻译任务按照 CC 协定,假如我们的任务有进犯到您的权益,请实时联络我们。
2KB项目(www.2kb.com,源码交易平台),提供担保交易、源码交易、虚拟商品、在家创业、在线创业、任务交易、网站设计、软件设计、网络兼职、站长交易、域名交易、链接买卖、网站交易、广告买卖、站长培训、建站美工等服务