前事不忘,后事之师,不忘国耻!

 注册  找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1937|回复: 0

计算不包含最大值和最小值的均值

[复制链接]

计算不包含最大值和最小值的均值

[复制链接]
ehxz

主题

0

回帖

7163

积分

管理员

积分
7163
2007-10-16 17:18:40 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

×
问题

计算平均数,但希望排除最大和最小值,以(希望能)减少数据畸偏造成的影响。例如,计算除最高和最低工资外的所有职员的平均工资。

解决方案

MySQL和PostgreSQL

使用子查询排除最高和最低值:

1  select avg(sal)

2    from emp

3   where sal not in (

4      (select min(sal) from emp),

5      (select max(sal) from emp)

6   )

DB2、Oracle和SQL Server

使用内联视图及窗口函数MAX OVER和MIN OVER,生成一个结果集,可以很容易地从中剔除最大和最小值:

1  select avg(sal)

2    from (

3  select sal, min(sal)over() min_sal, max(sal)over() max_sal

4    from emp

5         ) x

6   where sal not in (min_sal,max_sal)

讨论

MySQL和PostgreSQL

子查询返回表中的最高工资和最低工资。针对返回的值使用NOT IN,就可以从平均值中排除最高工资和最低工资。记住,如果存在重复(多个职员都是最高或最低工资),那么他们都会被排除在平均值之外。如果只想排除一个最高和最低值,只需从SUM中减去它们,再做除法:

select (sum(sal)-min(sal)-max(sal))/(count(*)-2)

  from emp

DB2、Oracle和SQL Server

内联视图X将返回所有工资,其中包括最高工资和最低工资:

select sal, min(sal)over() min_sal, max(sal)over() max_sal

  from emp

      SAL   MIN_SAL   MAX_SAL

--------- --------- ---------

      800       800      5000

     1600       800      5000

     1250       800      5000

     2975       800      5000

     1250       800      5000

     2850       800      5000

     2450       800      5000

     3000       800      5000

     5000       800      5000

     1500       800      5000

     1100       800      5000

      950       800      5000

     3000       800      5000

     1300       800      5000

从每一行都可以访问最高工资和最低工资,因此,要找出哪些工资是最高工资的和/或最低工资的非常简单。外层查询会对内联视图X返回的行作筛选,这样,所有与MIN_SAL和MAX_SALAN相匹配的行都会从平均值中排除掉。
免责申明1、欢迎访问本站,本文内容及相关资源来源于网络,版权归版权方所有!本站原创内容版权归本站所有,请勿转载!
2、本文内容仅代表作者观点,不代表本站立场,作者自负,本站资源仅供学习研究,请勿非法使用,否则后果自负!请下载后24小时内删除!
3、本文内容,包括但不限于源码、文字、图片等,仅供参考。本站不对其安全性,正确性等作出保证。但本站会尽量审核会员发表的内容。
4、如本帖侵犯到任何版权问题,请立即告知本站 ,本站将及时删除并致以最深的歉意!客服邮箱:admin@dbabbs.com
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|Archiver|小黑屋|DBA论坛中国 ( 鲁ICP备20017503号-2 )

GMT+8, 2024-5-15 14:40 , Processed in 0.556381 second(s), 10 queries , MemCached On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表