【发布时间】:2021-01-25 01:03:14
【问题描述】:
【问题讨论】:
标签: sql sqlite datetime window-functions
【问题讨论】:
标签: sql sqlite datetime window-functions
一个选项使用聚合:
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)
这带来了 2020 年薪水高于 2019 年薪水且 2019 年薪水高于 2018 年薪水的员工——我是这样理解你的问题的。
【讨论】:
您可以使用lead()/lag() 和聚合来做到这一点:
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
如果您只想检查当前年份和前 2 年,请在 WHERE 子句中再添加 1 个条件:
...AND year = strftime('%Y', CURRENT_DATE)
因此您无需对当前年份进行硬编码,
【讨论】: