计算部门平均工资

计算部门平均工资

问题:
计算部门的平均工资,要求去掉部门的最高和最低工资,如果部门的最高和最低工资有相同的,则去掉一个即可;

1- 数据准备
t_emp_info: uuid(员工id), dept(部门), salary(薪水)
--数据准备
WITH t_emp_info AS (
SELECT * FROM (
  VALUES  (1001, '研发部', 16000 )
        , (1002, '市场部', 17000 ) , (1014, '产品部', 14000 )
        , (1003, '销售部', 11000 ) , (1015, '销售部', 16000 )
        , (1004, '研发部', 15000 ) , (1016, '研发部', 19000 )
        , (1005, '销售部', 12000 ) , (1017, '销售部', 11000 )
        , (1006, '研发部', 21000 ) , (1018, '产品部', 17000 )
        , (1007, '产品部', 16000 ) , (1019, '产品部', 15000 )
        , (1008, '研发部', 18000 ) , (1020, '研发部', 14000 )
        , (1009, '市场部', 17000 ) , (1021, '市场部', 13000 )
        , (1010, '产品部', 16000 ) , (1022, '产品部', 13000 )
        , (1011, '销售部', 10000 ) , (1023, '销售部', 12000 )
        , (1012, '研发部', 18000 ) , (1024, '销售部', 13000 )
        , (1013, '市场部', 15000 ) , (1025, '研发部', 16000 ) 
        
) AS table_name(uuid, dept, salary)
)
2- 代码实现
-- 1. 按部门工资排序, 正排和倒排
SELECT 
      uuid, dept, salary
    , ROW_NUMBER() OVER(PARTITION BY dept ORDER BY salary) AS rn1 -- 正排, 最低工资为 1
    , ROW_NUMBER() OVER(PARTITION BY dept ORDER BY salary desc ) AS rn2 -- 倒排, 最高工资为 1
FROM t_emp_info ;
uuiddeptsalaryrn1rn2
1018产品部1700061
1010产品部1600042
1007产品部1600053
1019产品部1500034
1014产品部1400025
1022产品部1300016
1002市场部1700031
1009市场部1700042
1013市场部1500023
1021市场部1300014
--2. 去除最高工资和最低工资, 求部门平均工资
SELECT 
      dept, AVG(salary) salary_avg
FROM (
    SELECT 
          uuid, dept, salary
        , ROW_NUMBER() OVER(PARTITION BY dept ORDER BY salary) AS rn1
        , ROW_NUMBER() OVER(PARTITION BY dept ORDER BY salary desc ) AS rn2
    FROM t_emp_info
) a
WHERE rn1 != 1 AND rn2 != 1  -- 去除最高工资和最低工资
GROUP BY dept 
;

去除最高工资和最低工资

uuiddeptsalaryrn1rn2
1010产品部1600042
1007产品部1600053
1019产品部1500034
1014产品部1400025
1009市场部1700042
1013市场部1500023
1016研发部1900072
1012研发部1800053
1008研发部1800064
1025研发部1600035

求部门平均工资

deptsalary_avg
产品部15250.0
市场部16000.0
研发部17000.0
销售部11800.0
end
  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值