Показать указанный столбец искомого значения в mysql

#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