Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL查询以查找加薪3年的员工?_Sql_Sqlite_Datetime_Window Functions - Fatal编程技术网

SQL查询以查找加薪3年的员工?

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

这是桌子。我最初的观察是询问员工的年薪增长情况,但我不知道如何做到这一点。员工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(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) 

因此,您不需要硬编码当前年份,

是的,这很有效!这使得我每年把工资加起来更有意义。谢谢你!