工资增加时如何获取值的记录

时间:2018-05-19 20:29:59

标签: sql sql-server sql-server-2014

我想检查一名员工的薪水是否增加了100到500之间的工资。

Employee   Salary   Serial No    ID     Criteria
James       500      1         110      Inc
James       800      2         110      NA
James       900      3         110      NA
James       1200     4         110      Inc
James       1100     5         110      NA
James       1500     6         110      NA
Jim         1000     1         112      Inc
Jim         1100     2         112      NA
Jim         1300     3         112      NA
Jim         1500     4         112      NA
Jim         1900     5         112      Inc
Jim         1800     6         112      NA
Jim         2200     7         112      NA

- ID对每个员工都是唯一的,序列号是事件序列  员工在工资增加或减少方面的发生。我需要找到以前的标准为Inc的序列号(不一定必须是前一行,只要它满足100和500的标准)并且工资增加在100到500之间。请注意我们可能有多个记录满足标准,但我只需要一个增加的第一个。此外,我们也可能有薪水减少,我不需要显示它而是显示具有令人满意的标准的下一条记录。我们只需要查看标准为Inc,然后查找满足100到500范围的值,并获得第一个值。

- 期望的输出

Employee   Salary   Serial No    ID     Criteria

 James       800      2         110      NA
 James       1500     6         110      NA
 Jim         1100     2         112      NA
 Jim         2200     7         112      NA

1 个答案:

答案 0 :(得分:1)

您可以通过with子句中的多个条目逐步向记录添加信息来实现此目的。

在第一个select中,我刚刚复制了您的示例数据。最终结果将生成所有中间信息,以便您可以看到已应用的逻辑:

with salary(Employee, Salary, SerialNo, ID,  Criteria) as (
    select 'James',   500,    1,        110, 'Inc'  union all
    select 'James',   800,    2,        110, 'NA'   union all
    select 'James',   900,    3,        110, 'NA'   union all
    select 'James',   1200,   4,        110, 'Inc'  union all
    select 'James',   1100,   5,        110, 'NA'   union all
    select 'James',   1500,   6,        110, 'NA'   union all
    select 'Jim',     1000,   1,        112, 'Inc'  union all
    select 'Jim',     1100,   2,        112, 'NA'   union all
    select 'Jim',     1300,   3,        112, 'NA'   union all
    select 'Jim',     1500,   4,        112, 'NA'   union all
    select 'Jim',     1900,   5,        112, 'Inc'  union all
    select 'Jim',     1800,   6,        112, 'NA'   union all
    select 'Jim',     2200,   7,        112, 'NA'
), 
extended as (
    select salary.*,
           count(case Criteria when 'Inc' then 1 end) over 
                (partition by Employee order by SerialNo) incGroup
    from   salary
),
extended2 as (
    select extended.*,
           first_value(Salary) over
                (partition by Employee, incGroup order by SerialNo) incSalary
    from   extended
),
extended3 as (
    select extended2.*,
           row_number() over
                (partition by Employee, incGroup order by SerialNo) rn
    from   extended2
    where  Salary - incSalary between 100 and 500
)
select * from extended3 where rn = 1;

rextester.com

上查看它

NB /如果ID确实是员工的密钥,您可能希望按Employee ID进行分区。