Как получить записи по значениям, когда произошло увеличение зарплаты - PullRequest
0 голосов
/ 19 мая 2018

Я хочу проверить, увеличилась ли зарплата сотрудника между 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

- идентификатор уникален для каждого сотрудника, а серийный номер - это последовательность событий для сотрудника.с точки зрения увеличения или уменьшения заработной платы.Мне нужно найти серийный номер, который имел предыдущие критерии, как 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 голосов
/ 20 мая 2018

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

...