MEDIAN

更新时间:
复制 MD 格式

MEDIAN函数用于计算中位数。

使用限制

窗口函数的使用限制如下:

  • 窗口函数只能出现在select语句中。

  • 窗口函数中不能嵌套使用窗口函数和聚合函数。

  • 窗口函数不能和同级别的聚合函数一起使用。

注意事项

  • 如果函数涉及新数据类型(TINYINT、SMALLINT、INT、FLOAT、VARCHAR、TIMESTAMPBINARY),在使用扩展函数时,需要执行相关语句开启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:必填。列值可以为DOUBLEDECIMAL类型。如果输入为STRINGBIGINT类型,会隐式转换为DOUBLE类型后参与运算。

  • expr:必填。待计算中位数的表达式。DOUBLE类型或DECIMAL类型。最多支持输入255个数字,至少要输入1个数字。

    当输入值为STRING类型或BIGINT类型,会隐式转换为DOUBLE类型后参与运算,输入为其他数据类型则返回报错。

  • partition_clauseorderby_clauseframe_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。

使用示例

示例数据

  1. 创建表 dept_sal

    CREATE TABLE IF NOT EXISTS dept_sal (
     deptno BIGINT,
     ename STRING,
     sal BIGINT
     );
  2. 插入测试数据

    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函数属于聚合函数或窗口函数。

  • 更多将多条输入记录进行求平均值、参数聚合的相关函数请参见聚合函数概述

  • 更多对指定开窗列的数据进行求和、数值排序的相关函数请参见窗口函数概述