SQL

使用SQL取 平均数,众数,中位数

Posted by 道行尚浅 on March 12, 2019

以EMP表中sal列为例

看下数据


SQL> select * from scott.emp ;
EMPNO ENAME      JOB         MGR HIREDATE          SAL      COMM DEPTNO
----- ---------- --------- ----- ----------- --------- --------- ------
 7369 SMITH      CLERK      7902 1980/12/17     800.00               20
 7499 ALLEN      SALESMAN   7698 1981/2/20     1600.00    300.00     30
 7521 WARD       SALESMAN   7698 1981/2/22     1250.00    500.00     30
 7566 JONES      MANAGER    7839 1981/4/2      2975.00               20
 7654 MARTIN     SALESMAN   7698 1981/9/28     1250.00   1400.00     30
 7698 BLAKE      MANAGER    7839 1981/5/1      2850.00               30
 7782 CLARK      MANAGER    7839 1981/6/9      2450.00               10
 7788 SCOTT      ANALYST    7566 1987/4/19     3000.00               20
 7839 KING       PRESIDENT       1981/11/17    5000.00               10
 7844 TURNER     SALESMAN   7698 1981/9/8      1500.00      0.00     30
 7876 ADAMS      CLERK      7788 1987/5/23     1100.00               20
 7900 JAMES      CLERK      7698 1981/12/3      950.00               30
 7902 FORD       ANALYST    7566 1981/12/3     3000.00               20
 7934 MILLER     CLERK      7782 1982/1/23     1300.00               10
14 rows selected


平均数

平均数

某列的平均值.

SQL> select avg(sal) from scott.emp ;
  AVG(SAL)
----------
2073.21428

众数

出现次数最多的值

SQL> select distinct sal
  2    from (select sal, count(*) cnt from scott.emp group by sal) t1,
  3         (select max(count(*)) cnt from scott.emp group by sal) t2
  4   where t1.cnt = t2. cnt ;
      SAL
---------
  1250.00

中位数

中位数是值数据排序后中间位置的值

中位数的计算分两种情况 : 数列长度为奇数,取中间一行 舒蕾长度为偶数,取中间两行的均值

数列长度为偶数,取中间两行均值


SQL> select avg(sal)
  2  from  (select sal, row_NUMBER() OVER(ORDER BY SAL) RN FROM SCOTT.EMP),
  3         (select ceil(count(*) / 2) cnt1, ceil(count(*) / 2 + 0.5) cnt2
  4            from scott. emp) where rn in(cnt1, cnt2) ;
  AVG(SAL)
----------
      1550
      

数列长度为奇数,取中间行的值




SQL> delete from scott.emp where sal= 5000 ;
1 row deleted

SQL> 
SQL> select avg(sal)
  2  from  (select sal, row_NUMBER() OVER(ORDER BY SAL) RN FROM SCOTT.EMP),
  3         (select ceil(count(*) / 2) cnt1, ceil(count(*) / 2 + 0.5) cnt2
  4            from scott. emp) where rn in(cnt1, cnt2) ;
  AVG(SAL)
----------
      1500