MEDIAN函数用于计算中位数。
使用限制
窗口函数的使用限制如下:
窗口函数只能出现在
select语句中。窗口函数中不能嵌套使用窗口函数和聚合函数。
窗口函数不能和同级别的聚合函数一起使用。
注意事项
如果函数涉及新数据类型(TINYINT、SMALLINT、INT、FLOAT、VARCHAR、TIMESTAMP或BINARY),在使用扩展函数时,需要执行相关语句开启2.0数据类型开关:
Session级别:在SQL语句前添加
SET odps.sql.type.system.odps2=true;,并与SQL语句一起提交执行。Project级别:项目所有者通过
setproject odps.sql.type.system.odps2=true;设置整个项目的数据类型。
对
setproject的详细说明,请参见项目空间操作。关于开启Project级别数据类型的注意事项,请参见数据类型版本说明。单个Worker里的元素数量不能超过两百万。
在同一条SQL语句中同时使用多个聚合函数时,如果项目资源不足,会出现内存溢出问题,请根据实际业务情况优化SQL或购买计算资源。
命令格式
-- 计算中位数
DOUBLE MEDIAN(DOUBLE <colname>)
DECIMAL MEDIAN(DECIMAL <colname>)
-- 计算窗口中expr的中位数。
MEDIAN(<expr>) OVER ([partition_clause] [orderby_clause] [frame_clause])参数说明
colname:必填。列值可以为DOUBLE或DECIMAL类型。如果输入为STRING或BIGINT类型,会隐式转换为DOUBLE类型后参与运算。
expr:必填。待计算中位数的表达式。DOUBLE类型或DECIMAL类型。最多支持输入255个数字,至少要输入1个数字。
当输入值为STRING类型或BIGINT类型,会隐式转换为DOUBLE类型后参与运算,输入为其他数据类型则返回报错。
partition_clause、orderby_clause及frame_clause:详情请参见windowing_definition。
返回值说明
若colname值为NULL时,该行不参与计算。其他类型返回规则如下:
输入类型
返回类型
TINYINT
DOUBLE
SMALLINT
DOUBLE
INT
DOUBLE
BIGINT
DOUBLE
FLOAT
DOUBLE
DOUBLE
DOUBLE
DECIMAL
DECIMAL
expr若为DECIMAL类型,返回DECIMAL类型。其他情况下返回DOUBLE类型。expr的值都为NULL时,返回结果为NULL。
使用示例
示例数据
创建表
dept_salCREATE TABLE IF NOT EXISTS dept_sal ( deptno BIGINT, ename STRING, sal BIGINT );插入测试数据
INSERT INTO dept_sal VALUES (10, 'KING', 5000), (10, 'CLARK', 2450), (10, 'MILLER', 1300), (20, 'SCOTT', 3000), (20, 'FORD', 3000), (20, 'JONES', 2975), (30, 'BLAKE', 2850), (30, 'ALLEN', 1600), (30, 'WARD', 1250);
示例1:计算所有职工的薪资(sal)中位数
SELECT MEDIAN(sal) FROM dept_sal;
-- 返回结果如下:
+------------+
| _c0 |
+------------+
| 2850.0 |
+------------+示例2:按部门分组计算薪水中位数
与GROUP BY配合使用,对所有职工按照部门(deptno)进行分组,计算各部门员工的薪资(sal)中位数。
SELECT deptno, MEDIAN(sal) FROM dept_sal GROUP BY deptno;
-- 返回结果如下:
+------------+------------+
| deptno | _c1 |
+------------+------------+
| 10 | 2450.0 |
| 20 | 3000.0 |
| 30 | 1600.0 |
+------------+------------+示例3:部门开窗计算薪水中位数
指定部门(deptno)为开窗列,计算薪水(sal)中位数,返回当前窗口(相同deptno)的中位数。
SELECT deptno, sal, MEDIAN(sal) OVER (PARTITION BY deptno) FROM dept_sal;
-- 返回结果如下:
+------------+------------+------------+
| deptno | sal | _c2 |
+------------+------------+------------+
| 10 | 5000 | 2450.0 |
| 10 | 2450 | 2450.0 |
| 10 | 1300 | 2450.0 |
| 20 | 3000 | 3000.0 |
| 20 | 3000 | 3000.0 |
| 20 | 2975 | 3000.0 |
| 30 | 2850 | 1600.0 |
| 30 | 1600 | 1600.0 |
| 30 | 1250 | 1600.0 |
+------------+------------+------------+相关函数
MEDIAN函数属于聚合函数或窗口函数。