我想检查一名员工的薪水是否增加了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
答案 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;
上查看它
NB /如果ID
确实是员工的密钥,您可能希望按Employee
ID
进行分区。