按公司最高工资定税率:边界值要看清
LeetCode 1468 · 窗口 MAX、分段 CASE、边界条件
面试怎么回答
用 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 的处理可能不同,财务场景要明确取整规则。