Вы можете сделать это, постепенно добавляя информацию к своим записям через несколько записей в предложении 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
является ключом сотрудника.