#mysql #sql
#mysql #sql
Вопрос:
У меня есть база данных, полная данных, выделила важные:
Моя задача — найти те рабочие места, которые представляют минимальное и максимальное количество занятых, только название этих рабочих мест. Безуспешно пытался это сделать.
SELECT jobs.JOB_TITLE FROM employees
INNER JOIN jobs ON employees.JOB_ID = jobs.JOB_ID
INNER JOIN employees AS emp1 ON employees.EMPLOYEE_ID = emp1.EMPLOYEE_ID
GROUP BY jobs.JOB_ID
HAVING COUNT(MIN(emp1.EMPLOYEE_ID)) = COUNT(MIN(employees.EMPLOYEE_ID)) OR
COUNT(MAX(emp1.EMPLOYEE_ID)) = COUNT(MAX(employees.EMPLOYEE_ID))
Ответ №1:
Хммм … Один метод использует WHERE
предложение:
SELECT j.JOB_TITLE
FROM jobs j
WHERE j.job_id = (SELECT e.job_id
from employees e
GROUP BY e.job_id
ORDER BY COUNT(*) ASC
LIMIT 1
) OR
j.job_id = (SELECT e.job_id
from employees e
GROUP BY e.job_id
ORDER BY COUNT(*) ASC
LIMIT 1
) ;
Я предпочитаю функцию окна, хотя:
select j.job_title
from jobs j join
(select e.job_id, count(*) as cnt,
rank() over (order by count(*) asc) as seqnum_asc,
rank() over (order by count(*) desc) as seqnum_desc,
from employees e
group by e.job_id
) e
using (job_id)
where 1 in (seqnum_asc, seqnum_desc);
Конечно, оба они возвращают только задания, в которых есть сотрудники. Теоретически, может быть наименьшее количество владельцев заданий 0
. Вторая версия может быть изменена для обработки этого.
Ответ №2:
Если ваша версия MySQL 8.0 , вы можете использовать функцию окна FIRST_VALUE():
SELECT DISTINCT
FIRST_VALUE(j.JOB_TITLE) OVER (ORDER BY COUNT(e.EMPLOYEE_ID)) min_job,
FIRST_VALUE(j.JOB_TITLE) OVER (ORDER BY COUNT(e.EMPLOYEE_ID) DESC) max_job
FROM jobs j LEFT JOIN employees e
ON e.JOB_ID = j.JOB_ID
GROUP BY j.JOB_ID, j.JOB_TITLE