Как посчитать размер каждой группы при группировке в SQL?

«Как посчитать размер каждой группы при группировке в SQL?» — вопрос из категории SQL, который задают на 26% собеседований Data Scientist / ML Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

Базовый запрос:

SELECT 
    department_id, -- столбец для группировки
    COUNT(*) AS employee_count -- подсчет строк в группе
FROM 
    employees
GROUP BY 
    department_id;

Этот запрос вернет список отделов и количество сотрудников в каждом.

Важные нюансы и варианты использования:

  • *`COUNT()vsCOUNT(column_name):**COUNT(*)считает все строки в группе.COUNT(column_name)считает только не-NULL значения в указанном столбце. Например,COUNT(manager_id)` покажет, у скольких сотрудников в отделе указан руководитель.
  • Фильтрация групп (HAVING): Чтобы отфильтровать результат по размеру группы, использую HAVING, а не WHERE.
    SELECT 
        department_id, 
        COUNT(*) AS employee_count
    FROM 
        employees
    GROUP BY 
        department_id
    HAVING 
        COUNT(*) > 5; -- Только отделы с более чем 5 сотрудниками
  • Сортировка по размеру группы:
    SELECT 
        department_id, 
        COUNT(*) AS employee_count
    FROM 
        employees
    GROUP BY 
        department_id
    ORDER BY 
        employee_count DESC; -- От самого многочисленного отдела к самому маленькому
  • Группировка по нескольким полям: Можно группировать по комбинации столбцов.
    SELECT 
        department_id, 
        job_title, 
        COUNT(*) AS count
    FROM 
        employees
    GROUP BY 
        department_id, job_title;