Назад | Перейти на главную страницу

Преобразовать в несколько диапазонов данных

У меня есть ссылка на данные сотрудника ниже

Это один из примеров в файле, состоящем из нескольких строк. Первоначальный ввод может содержать более двух строк для каждого сотрудника, но логика преобразования будет такой же.

Спасибо за помощь!

После настройки некоторых тестовых данных:

DECLARE @EmployeeUtil TABLE (
    Employee_ID INT,
    [Date] DATE,
    Previous_FTE DECIMAL(3,2),
    FTE DECIMAL(3,2)
)

INSERT INTO @EmployeeUtil
SELECT 1, '2016-03-24', 1, 0.67
UNION
SELECT 1, '2016-04-24', 0.67, 0.8
UNION
SELECT 1, '2016-06-01', 0.8, 1
UNION
SELECT 2, '2016-01-01', 1, 0.5
UNION
SELECT 2, '2016-02-03', 0.5, 0.6
UNION
SELECT 2, '2016-03-25', 0.6, 0.8
UNION
SELECT 2, '2016-04-20', 0.8, 0.25
UNION
SELECT 2, '2016-05-01', 0.25, 0.4
UNION
SELECT 2, '2016-06-01', 0.4, 0.8
UNION
SELECT 2, '2016-07-01', 0.8, 1

Я бы использовал оконные функции для достижения желаемого результата:

    SELECT  Employee_ID,
            [Date] AS [Start_date],
            LEAD([Date]) OVER (PARTITION BY Employee_ID ORDER BY [DATE]) AS [End Date],
            FTE
    FROM @EmployeeUtil 
UNION
    SELECT  e1.Employee_ID,
            NULL AS [Start_date],
            FIRST_VALUE(e1.[Date]) OVER (PARTITION BY e1.Employee_ID ORDER BY e1.[DATE]) AS [End Date],
            FIRST_VALUE(e1.Previous_FTE) OVER (PARTITION BY e1.Employee_ID ORDER BY e1.[DATE]) AS FTE
    FROM @EmployeeUtil e1
ORDER BY 1, 2, 3

В SELECT в первой части UNION выбирает все диапазоны дат с соответствующими датами начала и окончания и значениями FTE для этого диапазона дат, за исключением неограниченного периода до самой ранней даты, зарегистрированной для каждого сотрудника.

В SELECT во второй части UNION решает эту проблему, создавая дополнительную строку в результатах для каждого сотрудника, чтобы показать его значение FTE до самой ранней даты.