LeetCodee

570. Managers with at Least 5 Direct Reports

Problem Description

Table: Employee

+-------------+----------+
| Column Name | Type     |
+-------------+----------+
| id          | int      |
| name        | varchar  |
| department  | varchar  |
| managerId   | int      |
+-------------+----------+
id is the primary key column for this table.
Each row of this table indicates the name of an employee, their department, and the id of their manager.
If managerId is null, then the employee does not have a manager.
No employee will be the manager of themselves.

Write an SQL query to report the managers with at least 5 direct reports.

Return the result table in any order.

Example:

Input: 
Employee table:
+-----+-------+------------+-----------+
| id  | name  | department | managerId |
+-----+-------+------------+-----------+
| 101 | John  | A          | null      |
| 102 | Dan   | A          | 101       |
| 103 | James | A          | 101       |
| 104 | Amy   | A          | 101       |
| 105 | Anne  | A          | 101       |
| 106 | Ron   | B          | 101       |
+-----+-------+------------+-----------+
Output: 
+------+
| name |
+------+
| John |
+------+

Solution

MySQL Solution

SELECT e1.name
FROM Employee e1
JOIN (
    SELECT managerId
    FROM Employee
    WHERE managerId IS NOT NULL
    GROUP BY managerId
    HAVING COUNT(*) >= 5
) e2
ON e1.id = e2.managerId;

Alternative Solution:

SELECT name
FROM Employee
WHERE id IN (
    SELECT managerId
    FROM Employee
    WHERE managerId IS NOT NULL
    GROUP BY managerId
    HAVING COUNT(*) >= 5
);

PostgreSQL Solution

SELECT e1.name
FROM Employee e1
INNER JOIN (
    SELECT managerId
    FROM Employee
    WHERE managerId IS NOT NULL
    GROUP BY managerId
    HAVING COUNT(*) >= 5
) e2
ON e1.id = e2.managerId;

MS SQL Server Solution

SELECT name
FROM Employee
WHERE id IN (
    SELECT managerId
    FROM Employee
    WHERE managerId IS NOT NULL
    GROUP BY managerId
    HAVING COUNT(*) >= 5
);

Oracle Solution

SELECT e1.name
FROM Employee e1
JOIN (
    SELECT managerId
    FROM Employee
    WHERE managerId IS NOT NULL
    GROUP BY managerId
    HAVING COUNT(*) >= 5
) e2
ON e1.id = e2.managerId;

Approach Explanation

The solution uses SQL aggregation and joins:

  1. Key Insights:
    • Group by manager
    • Count direct reports
    • Join for names
    • Filter results
  2. Algorithm Steps:
    • Group employees
    • Count reports
    • Filter count >= 5
    • Get manager names

Implementation Details:

  • Subquery usage
  • JOIN operation
  • GROUP BY clause
  • HAVING clause

Optimization Insights:

  • Index usage
  • Join efficiency
  • Subquery optimization
  • Filter placement

Edge Cases:

  • No managers
  • NULL values
  • Exactly 5 reports
  • Multiple managers