我正在做这个 StrataScratch SQL 问题。
建议的解决方案对每个部门的每个最大值使用两个子查询,然后减去它们以获得绝对值。我想使用dense_rank/rank窗口函数来解决这个问题,首先对每个部门的工资进行排名,然后对它们进行排序,最高工资将获得数字1。我在执行上述操作的地方编写了这个查询并将其放入CTE中,然后我打算使用 CASE 语句从营销部门选择最高工资,并用另一个 case 语句减去该值以获得工程部门的最大值。
WITH CTE AS
(
select
dpt.department,
emp.salary,
dense_rank() over (partition by department order by salary desc) as salary_rank
from db_employee as emp
join db_dept as dpt
on emp.department_id=dpt.id
where department = 'engineering' or department = 'marketing'
)
select
(case when department = 'marketing' AND salary_rank = 1 THEN salary END) -
(case when department = 'engineering' AND salary_rank = 1 THEN salary END) as sal_diff
FROM
CTE
问题是返回了NULL值。我尝试理解为什么会这样,我只看到营销部门的第一个案例语句的值返回结果页面中间的值,就好像它返回一些空行,然后返回所需的薪水(有点奇怪,看起来像一个错误或其他什么)。
我的意思是这部分:
(当部门=“营销”且salary_rank=1然后薪水结束时)=应该返回
下面返回所需的薪水值。 (当部门=“工程”并且salary_rank=1然后薪水结束时) =应该返回48187
我认为 ABS 功能的放置可能有问题,但我无法弄清楚。 我知道我的查询一定有问题(可能是从 cte 查询中选择),所以我希望您能提供帮助。我实在想不通。我的条件陈述或我的策略有问题吗?出于某种原因,我认为这种带有窗口函数的方法可以工作。
提前感谢您的帮助:)
您的情况
(case when department = 'marketing' AND salary_rank = 1 THEN salary END) -
(case when department = 'engineering' AND salary_rank = 1 THEN salary END) as sal_diff
不可能同时都为真,因此其中一个为null
,因此减法的结果必须为空。因为
department
不能同时是“营销”和“工程”,因此只有一个 case 语句匹配,并且当没有
else
子句时,将返回
null
。您需要将 CTE 连接到自身,以便两个值都出现在连接的一行中:
WITH CTE AS (
select
dpt.department,
emp.salary,
dense_rank() over (partition by department order by salary desc) as salary_rank
from db_employee as emp
join db_dept as dpt on emp.department_id=dpt.id
where department in ('engineering', 'marketing')
)
select
m.salary - e.salary as sal_diff
from CTE m
join CTE e on e.salary_rank = m.salary_rank
and e.department = 'engineering'
where m.department = 'marketing'