【问题标题】:SQL query to find employee with 3 year over year salary raises?SQL查询查找3年加薪的员工?
【发布时间】:2021-01-25 01:03:14
【问题描述】:

这是桌子。我最初的观察是查询员工每年增加薪水的薪水,但对如何做到这一点感到困惑。员工 1 是唯一增加了三年的员工,但不知道如何挑选出来。谢谢!

【问题讨论】:

    标签: 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(where year = 2019) > max(salary) filter(where year = 2018)
    

    这带来了 2020 年薪水高于 2019 年薪水且 2019 年薪水高于 2018 年薪水的员工——我是这样理解你的问题的。

    【讨论】:

    • 是的,行得通!这让我每年汇总工资更有意义。欣赏!
    【解决方案2】:

    您可以使用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;
    

    这会比较相邻年份的薪水,并返回价值一直在增加的员工。它假定年份没有差距 - 就像您的样本数据一样。

    这种方法的优点是您无需提前知道年份。

    【讨论】:

      【解决方案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) 
      

      因此您无需对当前年份进行硬编码,

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-02-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多