leetcode困难之615.平均工资

本文介绍了一种查询方法,用于比较特定日期内每个部门的平均薪资与整个公司的平均薪资,并给出比较结果(更高、更低或相同)。使用了SQL窗口函数进行高效计算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

给如下两个表,写一个查询语句,求出在每一个工资发放日,每个部门的平均工资与公司的平均工资的比较结果 (高 / 低 / 相同)。

表: salary

idemployee_idamountpay_date
1190002017-03-31
2260002017-03-31
33100002017-03-31
4170002017-02-28
5260002017-02-28
6380002017-02-28

employee_id 字段是表 employee 中 employee_id 字段的外键。

employee_iddepartment_id
11
22
32

对于如上样例数据,结果为:

pay_monthdepartment_idcomparison
2017-031higher
2017-032lower
2017-021same
2017-022same

解释

在三月,公司的平均工资是 (9000+6000+10000)/3 = 8333.33…

由于部门 ‘1’ 里只有一个 employee_id 为 ‘1’ 的员工,所以部门 ‘1’ 的平均工资就是此人的工资 9000 。因为 9000 > 8333.33 ,所以比较结果是 ‘higher’。

第二个部门的平均工资为 employee_id 为 ‘2’ 和 ‘3’ 两个人的平均工资,为 (6000+10000)/2=8000 。因为 8000 < 8333.33 ,所以比较结果是 ‘lower’ 。

在二月用同样的公式求平均工资并比较,比较结果为 ‘same’ ,因为部门 ‘1’ 和部门 ‘2’ 的平均工资与公司的平均工资相同,都是 7000 。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/average-salary-departments-vs-company
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解答

注意,考虑到不是所有的员工当月发薪都是同一天,所以如果日期转换成月份是到最后才改,要去重

法一

窗口函数也是可以直接互相比较的

select distinct * 
from (
    select substr(s.pay_date,1,7) pay_month, e.department_id,
        case when avg(amount) over(partition by e.department_id,s.pay_date)>
                avg(amount) over(partition by s.pay_date) then 'higher'
            when avg(amount) over(partition by e.department_id,s.pay_date)<
                avg(amount) over(partition by s.pay_date) then 'lower'
            else 'same'
        end as comparison
    from salary s left join employee e using(employee_id)
    ) t 
order by 1 desc

法二
select distinct substr(t1.pay_date,1,7) pay_month,department_id,
    case when t1.ag_sal_dep>t2.ag_sal then 'higher'
        when t1.ag_sal_dep<t2.ag_sal then 'lower'
        else 'same'
    end comparison
from
    (select pay_date,department_id,avg(amount) ag_sal_dep
    from employee e left join salary s using(employee_id)
    group by pay_date,department_id
    ) t1
left join 
    (select pay_date,avg(amount) ag_sal
    from salary
    group by pay_date
    ) t2 using(pay_date)
order by  substr(t1.pay_date,1,7) desc,department_id
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值