Как вернуть начальника отдела с тем работником, который прослужил дольше всех?

  • Автор темы Respect2
  • Обновлено
  • 13, May 2024
  • #1
Сценарий/Проблема
У меня есть таблица, в которой хранятся идентификаторы работников, когда они начинают работать в отделе, а также когда покидают этот отдел. Это можно увидеть в SQL Fiddle: http://www.sqlfiddle.com/#!9/d0c982/1/0

Приведенный ниже код создаст таблицу, а также вставит тестовые данные.
 SELECT Worker_ID, DATEDIFF(Now(), Min(Start_Date)) as NowSubMin FROM Worker_Department
WHERE position != 'Leader'
GROUP BY Worker_ID

HAVING Worker_ID IN (SELECT Worker_ID FROM Worker_Department
 WHERE position != 'Leader' AND leave_date is null)

Код (SQL): мне нужно написать запрос, который найдет работника, работающего дольше всех, который в настоящее время находится в отделе (нулевая дата окончания). Однако те, кто занимает должность «Лидера», не имеют права занимать должность дольше всех.

Затем по результатам этого запроса мне нужно будет найти руководителя отдела в отделе, в котором в настоящее время работает сотрудник с наибольшим стажем работы.

ожидаемый результат
Глядя на предоставленные тестовые данные:


    • Работник 40 не может быть сотрудником с самым большим стажем работы, поскольку он больше не работает в компании.


    • Работники 10 и 20 не могут быть сотрудниками с наибольшим стажем работы, поскольку они оба занимают руководящую должность (однако это даст им право быть руководителем отдела в зависимости от того, кто является сотрудником с наибольшим стажем работы).


    • Работник 30 является сотрудником, работающим дольше всех, поскольку разница между текущей датой и самой старой датой начала работы больше, чем у работника 50.


    • Работник 30 сейчас работает в отделе 100. Это означает, что Сотрудник 10 — руководитель отдела, в котором на данный момент работает работник дольше всех.




Вывод запроса будет выглядеть примерно так
| идентификатор работника
|---------------
| 10

Если эта таблица была связана как внешний ключ с другой таблицей, выборку можно было изменить, включив в нее сведения об этом лидере (имя, телефон, адрес).

Текущий прогресс
Приведенный ниже запрос покажет работников, которые в настоящее время работают (те, у кого нет даты отпуска), отдел, в котором они работают, а также их роль в этом отделе.
 SELECT Worker_ID, DATEDIFF(Now(), Min(Start_Date)) as NowSubMin FROM Worker_Department WHERE position != 'Leader' GROUP BY Worker_ID

Код (SQL): приведенный ниже запрос вернет разницу между текущей датой и минимальной датой начала работника. Однако сюда входят те, у кого нет нулевой даты окончания (не актуально).
 SELECT Worker_ID, Department_ID, Position FROM Worker_Department WHERE position != 'Leader' AND leave_date is null

Код (SQL): Наконец, оба этих запроса были использованы для создания следующего запроса, который предназначен для возврата работающих в данный момент работников вместе с разницей дат между текущей датой и их первой датой начала.
 CREATE TABLE `Worker_Department` ( `Worker_ID` Integer NOT NULL , `Department_ID` Integer NOT NULL, `Position` Text NOT NULL, `Start_Date` datetime NOT NULL, `Leave_Date` datetime ); INSERT INTO `Worker_Department`(`Worker_ID`,`Department_ID`,`Position`,`Start_Date`) VALUES (10,100,'Leader','1980-11-11'), (20,200,'Leader','1980-11-11'); INSERT INTO `Worker_Department`(`Worker_ID`,`Department_ID`,`Position`,`Start_Date`,`Leave_Date`) VALUES (30,200,'Administrator','1980-11-11', '2014-02-02'), (40,200,'Receptionist','1975-11-11', '2014-02-02'); INSERT INTO `Worker_Department`(`Worker_ID`,`Department_ID`,`Position`,`Start_Date`) VALUES (50,300,'Administrator','2014-02-02'), (30,100,'Administrator','2014-02-02');

Код (SQL):

Respect2


Рег
03 Jul, 2012

Тем
67

Постов
191

Баллов
556
  • 18, May 2024
  • #2
В результате этого запроса выдается Worker_ID «20».

выберите * из worker_department, где

позиция = 'лидер' и

Department_ID=(выберите Department_ID из worker_department, где позиция!='leader' и Leave_Date имеет значение NULL, порядок по возрастанию Start_Date предела 1)

лимит 1

Проблема в предыдущем запросе заключалась в том, что я пытался выбрать Leave_Date=null, но это не сработало.

Должно быть: Leave_Date IS NULL.
 

Vl1980


Рег
28 Feb, 2011

Тем
72

Постов
209

Баллов
599
  • 11, Jun 2024
  • #3
Что-то вроде этого может сработать:

выберите DepartmentID в качестве Department_id из таблицы, где позиция!='leader' и LeaveDate=null, порядок по возрастанию предела startDate 1

«заказ по startDate по возрастанию», это та часть, которая определяет самого старого работающего работника.

LeaveDate=null, это означает, что работник все еще работает.

позиция!='лидер', это решает, что работник не является лидером.

Теперь передайте этот найденный идентификатор отдела другому запросу, чтобы выбрать идентификатор работника участника, которому принадлежит этот пользователь.

выберите * из таблицы, где позиция = 'лидер' и DepartmentID = Department_id предел 1;

Первый запрос — это выбор идентификатора отдела работника, который работает дольше всех и не является руководителем.

Затем он передает «найденный» идентификатор отдела в основной запрос, где он выбирает работника на руководящую должность.

Вы также можете попробовать объединить эти два запроса в один.

выберите * из таблицы, где позиция='лидер' и

DepartmentID=( выберите DepartmentID, где позиция!='leader' и LeaveDate=null порядок по startDate desc limit 1)

лимит 1;

Надеюсь, я правильно понял ваш вопрос...
 

Jaipshami100


Рег
15 Jan, 2011

Тем
67

Постов
190

Баллов
585
  • 11, Jun 2024
  • #4
Поэтому, чтобы получить только тех работников, которые работают дольше всего, мне нужно будет каким-то образом отфильтровать их так, чтобы возвращались только работники с максимальным значением в столбце «Сегодняшняя дата — исходная дата начала», а также идентификатор отдела их самого последнего отдела.
 

Orangeball


Рег
05 Sep, 2014

Тем
69

Постов
189

Баллов
554
Тем
403,760
Комментарии
400,028
Опыт
2,418,908

Интересно