如何使用简单的 SQL 查询在 MySQL 中计算中位数
2017-09-29 09:26
344 查看
什么是中位数?
数值型数组的中位数是在数据排序后位于数组中间项的值。如果数组有偶数个元素,中位数就是最中间的两个数值的平均数。中位数对于了解“我的值是否位于中间?”非常有用。比如,我在学校的最后一次考试中得了 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 中计算某列数据的中位数
很不幸,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 会决定将这一功能添加到内置产品中,这将简化获取中位数的查询。
相关文章推荐
- 使用笔记:mysql与oracle进行sql查询时如何表示日期
- 使用笔记:mysql与oracle进行sql查询时如何表示日期
- MySQL查询不使用索引汇总 + 如何优化sql语句
- MySQL GROUP_CONCAT函数使用示例:如何用一个SQL查询出一个班级各个学科第N名是谁?
- MySql中如何使用 explain 查询 SQL 的执行计划
- 如何使用Oracle查询并删除重复记录的SQL语句
- 如何使用SQLPLUS分析SQL语句(查询执行计划跟踪)
- 如何使用Oracle查询并删除重复记录的SQL语句
- LINQ to SQL系列 查询 使用LINQ to SQL做简单查询
- 如何计算应缴个人所得税? 使用SQL,理解SQL
- mysql 查看查询时如何分区是否被使用
- 如何使用Navicat MySQL导入.sql文件
- sql 上一条、下一条记录再次改进(文章底部红色字体)及如何在子查询中使用limit语法!我这个脑子啊
- 简单修改Hibernate源码,增加使用原生SQL查询时动态addEntity和addScalar功能
- SQL查询语句简要使用精华——之 简单查询
- 使用MySQL的慢查询日志找到低效的SQL语句
- 详解如何使用SQL中文分词组件查询表记录
- 简单修改Hibernate源码,增加使用原生SQL查询时动态addEntity和addScalar功能
- MYSQL:使用慢查询日志定位效率较低的SQL语句
- [MySQL优化] -- 如何使用SQL Profiler 性能分析器