- 13, May 2024
- #1
Сценарий/Проблема
У меня есть таблица, в которой хранятся идентификаторы работников, когда они начинают работать в отделе, а также когда покидают этот отдел. Это можно увидеть в SQL Fiddle: http://www.sqlfiddle.com/#!9/d0c982/1/0
Приведенный ниже код создаст таблицу, а также вставит тестовые данные.
Код (SQL): мне нужно написать запрос, который найдет работника, работающего дольше всех, который в настоящее время находится в отделе (нулевая дата окончания). Однако те, кто занимает должность «Лидера», не имеют права занимать должность дольше всех.
Затем по результатам этого запроса мне нужно будет найти руководителя отдела в отделе, в котором в настоящее время работает сотрудник с наибольшим стажем работы.
ожидаемый результат
Глядя на предоставленные тестовые данные:
Вывод запроса будет выглядеть примерно так
| идентификатор работника
|---------------
| 10
Если эта таблица была связана как внешний ключ с другой таблицей, выборку можно было изменить, включив в нее сведения об этом лидере (имя, телефон, адрес).
Текущий прогресс
Приведенный ниже запрос покажет работников, которые в настоящее время работают (те, у кого нет даты отпуска), отдел, в котором они работают, а также их роль в этом отделе.
Код (SQL): приведенный ниже запрос вернет разницу между текущей датой и минимальной датой начала работника. Однако сюда входят те, у кого нет нулевой даты окончания (не актуально).
Код (SQL): Наконец, оба этих запроса были использованы для создания следующего запроса, который предназначен для возврата работающих в данный момент работников вместе с разницей дат между текущей датой и их первой датой начала.
Код (SQL):
У меня есть таблица, в которой хранятся идентификаторы работников, когда они начинают работать в отделе, а также когда покидают этот отдел. Это можно увидеть в 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 — руководитель отдела, в котором на данный момент работает работник дольше всех.
- Работник 40 не может быть сотрудником с самым большим стажем работы, поскольку он больше не работает в компании.
Вывод запроса будет выглядеть примерно так
| идентификатор работника
|---------------
| 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):