题解 | #查找排除当前最大、最小salary之后的员工的平均工资avg_salary#

查找排除当前最大、最小salary之后的员工的平均工资avg_salary

http://www.nowcoder.com/practice/95078e5e1fba4438b85d9f11240bc591

本质上为排序,但也存在不涉及排序的简单操作方法
方法一 简便算法

SELECT (SUM(salary)-MAX(salary)-MIN(salary)) / (COUNT(salary)-2)
AS avg_salary
FROM salaries
WHERE to_date = '9999-01-01' 

方法二 实际思路

SELECT AVG(salary)
AS avg_salary
FROM salaries
WHERE salary NOT IN (SELECT MAX(salary) FROM salaries WHERE to_date = '9999-01-01' )
    and salary NOT IN (SELECT MIN(salary) FROM salaries WHERE to_date = '9999-01-01' )
    and to_date = '9999-01-01'

方法三 RANK() OVER()函数的使用

SELECT AVG(salary)
FROM(
    SELECT *
    RANK() OVER(ORDER BY salary) AS r1
    RANK() OVER(ORDER BY salary DESC) AS r2
    WHERE to_date = '9999-01-01'
) 
AS a
WHERE r1 != 1
    AND r2 != 1
全部评论

相关推荐

做个有文化的流氓:幸遇良师,幸遇好的hr
找工作中的小确幸
点赞 评论 收藏
分享
浩浩没烦恼:一二面加起来才一个小时? 我一面就一个小时多了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务