#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
aAssociate 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
.