SQL查询以查找加薪3年的员工?
这是桌子。我最初的观察是询问员工的年薪增长情况,但我不知道如何做到这一点。员工1是唯一一个有三年加薪的员工,但不知道如何挑选他们。谢谢SQL查询以查找加薪3年的员工?,sql,sqlite,datetime,window-functions,Sql,Sqlite,Datetime,Window Functions,这是桌子。我最初的观察是询问员工的年薪增长情况,但我不知道如何做到这一点。员工1是唯一一个有三年加薪的员工,但不知道如何挑选他们。谢谢 一个选项使用聚合: select employee_id from mytable t group by employee_id having max(salary) filter(where year = 2020) > max(salary) filter(where year = 2019) and max(salary) filter(whe
一个选项使用聚合:
select employee_id
from mytable t
group by employee_id
having max(salary) filter(where year = 2020) > max(salary) filter(where year = 2019)
and max(salary) filter(where year = 2019) > max(salary) filter(where year = 2018)
select employee_id
from (select t.*,
lag(salary) over (partition by employee_id order by year) as prev_salary
from t
) t
group by employee_id
having min(salary - prev_salary) > 0 and
count(*) = 3;
这就带来了2020年工资高于2019年工资、2019年工资高于2018年工资的员工——这就是我对你问题的理解。你可以使用
lead()
/lag()
和聚合:
select employee_id
from mytable t
group by employee_id
having max(salary) filter(where year = 2020) > max(salary) filter(where year = 2019)
and max(salary) filter(where year = 2019) > max(salary) filter(where year = 2018)
select employee_id
from (select t.*,
lag(salary) over (partition by employee_id order by year) as prev_salary
from t
) t
group by employee_id
having min(salary - prev_salary) > 0 and
count(*) = 3;
这将比较相邻年份的工资,并返回价值不断增加的员工。它假设这些年中没有间隔——就像在您的样本数据中一样
这种方法的优点是您不需要提前知道年份。我想您不想在查询中硬编码年份。
最佳选择是使用窗口函数
LAG()
获取前2年的工资,但您还应检查您检查的3年是否连续:
SELECT DISTINCT employee_id
FROM (
SELECT *,
LAG(year, 1) OVER (PARTITION BY employee_id ORDER BY year) year1,
LAG(salary, 1) OVER (PARTITION BY employee_id ORDER BY year) salary1,
LAG(year, 2) OVER (PARTITION BY employee_id ORDER BY year) year2,
LAG(salary, 2) OVER (PARTITION BY employee_id ORDER BY year) salary2
FROM tablename t
)
WHERE year1 = year - 1 AND year2 = year - 2 AND salary > salary1 AND salary1 > salary2
如果只想检查当前年份和前两年,则在WHERE
子句中再添加一个条件:
...AND year = strftime('%Y', CURRENT_DATE)
因此,您不需要硬编码当前年份,是的,这很有效!这使得我每年把工资加起来更有意义。谢谢你!