Самая последняя должность сотрудника за отчетный период

#sql #sql-server

Вопрос:

Я пытаюсь выполнить 2 вещи из следующих данных:

СОТРУДНИК позиция ДАТА ИЗ ДАТА
0760891 Заместитель директора 2014-10-28 00:00:00.000 2018-05-11 00:00:00.000
0760891 исполнительный директор 2018-05-14 00:00:00.000 нулевой
1048137 Помощник директора 2019-07-08 00:00:00.000 2021-07-12 00:00:00.000
1048137 Координатор 2021-07-13 00:00:00.000 нулевой

Мы используем оценочный год, который длится с мая по апрель (5/1 — 4/30). Итак, для каждого сотрудника мне нужен вывод, который выглядит следующим образом:

СОТРУДНИК Позиция Год Проведения Оценки
0760891 Заместитель директора 2015
0760891 Заместитель директора 2016
0760891 Заместитель директора 2017
0760891 Заместитель директора 2018
0760891 Заместитель директора 2019
0760891 исполнительный директор 2020
0760891 исполнительный директор 2021
0760891 исполнительный директор 2022
1048137 Помощник директора 2020
1048137 Помощник директора 2021
1048137 Помощник директора 2022

Первое требование: «Заполните» строку Должности и года оценки для каждого сотрудника для любых лет оценки между ДАТОЙ и ДАТОЙ.

Второе требование: Возвращайте только последнюю активную должность на ИДЕНТИФИКАТОР СОТРУДНИКА и Год оценки в тех случаях, когда значения ДАТЫ и ДАТЫ для двух должностей перекрываются в течение года оценки.

Проблема, с которой я сталкиваюсь, заключается в том, что я, похоже, не могу получить самую последнюю (последнюю) должность в ситуациях, когда-например, в случае с EMPLOYEEID 1048137 здесь-есть две «активные» должности в один и тот же год оценки (либо начинается, либо заканчивается в год оценки). Значение оценки этого сотрудника в 2022 году должно быть Координатором, а не помощником директора, но код, который я написал, дает результат, изображенный во второй таблице выше. Похоже, я должен иметь возможность использовать ROW_NUMBER, чтобы получить то, что мне нужно, но я изо всех сил пытаюсь реализовать его правильно (если, на самом деле, мне вообще нужно реализовать его для этой проблемы).

SQL Server 2014.

Большое спасибо за ваше доброе внимание.

Комментарии:

1. ВНЕШНЕЕ ПРИСОЕДИНЕНИЕ к таблице за год/cte.

2. Почему 0760891 a Associate Director входит 2019 , когда они стали одним 2018-05-14 00:00:00.000 целым ? Когда начался ваш 2019 год ( 2019-05-01 ), они были Executive Director почти целый год.

3. Извините, @Larnu, да, наш оценочный год работает как финансовый год, который начинается 1 июля. Таким образом, 1 июля 2021 года-2022 финансовый год. Для нашего оценочного года 1 мая 2021 года является первым днем 2022 года оценки. 0760891 был исполнительным директором всего две недели в 2022 году оценки, но это значение я хочу отобразить в своем конечном наборе результатов, а не должность заместителя директора (та же проблема, что и 1048137).

4. «Мы используем оценочный год, который длится с мая по апрель (5/1 — 4/30)». Против «наш оценочный год работает как финансовый год, который начинается 1 июля». Эти утверждения противоречат друг другу.

5. Это также не объясняет, почему у человека есть другой титул в 2019 году, когда он этого никогда не делает

Ответ №1:

Вы могли бы сделать что-то вроде этого:

 SELECT ...
FROM yourtable a
LEFT JOIN yourtable b
ON a.EMPLOYEEID = b.EMPLOYEEID and a.DATETO > b.DATETO
WHERE b.EMPLOYEEID IS NULL
 

Пояснение: Вы ищете a записи, в которых не существует такой b записи, которая имеет то же EMPLOYEEID самое и имеет более позднюю DATEFROM .