订阅更新

按公司最高工资定税率:边界值要看清

SQL 实战 123 题 · 第 113 题 中等 约 2 分钟读完

LeetCode 1468 · 窗口 MAX、分段 CASE、边界条件

本文目录
  1. 面试怎么回答
  2. 题意
  3. 表结构
  4. 思路
  5. 参考解法
  6. 易错点

面试怎么回答

用 MAX(salary) OVER (PARTITION BY company_id) 拿到公司最高工资,CASE 分三档算税后工资再 ROUND。我会特别核对边界:10000 属于中间档,条件要写 <= 10000。分段规则的边界是面试和实际工作里最容易出错的地方。

先把这段讲顺;面试官追问时,再展开下面的原理和细节。

详细讲解

题意

工资表记录每个公司每个员工的工资。每个公司的税率由该公司最高工资决定:最高工资低于 1000 税率 0%,在 1000 到 10000 之间(含)税率 24%,高于 10000 税率 49%。输出每个员工的税后工资(四舍五入到整数)。

表结构

  • Salaries:company_id、employee_id、employee_name、salary;(company_id, employee_id) 为主键

思路

每个员工都要知道自己公司的最高工资,用 MAX(salary) OVER (PARTITION BY company_id) 挂到每行上,再用 CASE 分段计算税后工资。要注意边界:最高工资正好是 10000 时属于 24% 档。原解法写成 < 10000,这时会被错误地归到 49%。

参考解法

select company_id,employee_id , employee_name,
round(case when maxsalary<1000 then salary
       when maxsalary<10000 then salary*(1-0.24)
       else salary*(1-0.49) end ,0)salary
from(
    select *,max(salary) over(partition by company_id ) maxsalary
    from Salaries 
)t1

另一种写法:边界写对的版本

SELECT company_id, employee_id, employee_name,
       ROUND(salary * CASE WHEN max_salary < 1000 THEN 1
                           WHEN max_salary <= 10000 THEN 0.76
                           ELSE 0.51 END) AS salary
FROM (SELECT *, MAX(salary) OVER (PARTITION BY company_id) AS max_salary FROM Salaries) t

易错点

  • 「1000 到 10000 之间」包含 10000,分段条件要写 <= 10000。
  • ROUND(x, 0) 是四舍五入,不同数据库对 .5 的处理可能不同,财务场景要明确取整规则。
刷题进度保存在当前浏览器