❤️博客主页: 楚生辉
❤️系列专栏:【LeetCode刷题】
❤️一句短话: 坚持不懈,孜孜不倦
1.题目描述
员工表:Employee
+---------------+---------+
| Column Name | Type |
+---------------+---------+
| employee_id | int |
| team_id | int |
+---------------+---------+
employee_id 字段是这张表的主键,表中的每一行都包含每个员工的 ID 和他们所属的团队。
编写一个 SQL 查询,以求得每个员工所在团队的总人数。
查询结果中的顺序无特定要求。
查询结果格式示例如下:
Employee Table:
+-------------+------------+
| employee_id | team_id |
+-------------+------------+
| 1 | 8 |
| 2 | 8 |
| 3 | 8 |
| 4 | 7 |
| 5 | 9 |
| 6 | 9 |
+-------------+------------+
Result table:
+-------------+------------+
| employee_id | team_size |
+-------------+------------+
| 1 | 3 |
| 2 | 3 |
| 3 | 3 |
| 4 | 1 |
| 5 | 2 |
| 6 | 2 |
+-------------+------------+
ID 为 1、2、3 的员工是 team_id 为 8 的团队的成员,
ID 为 4 的员工是 team_id 为 7 的团队的成员,
ID 为 5、6 的员工是 team_id 为 9 的团队的成员。
2.代码实现
- 方法一:自联结
SELECT
e1.employee_id,
count(*) team_size
FROM
employee e1
LEFT JOIN employee e2 ON e1.team_id = e2.team_id
GROUP BY
e1.employee_id;
- 方法二:巧妙的使用窗口函数,根据team_id对数据分区计数
SELECT
employee_id,
count(*) over ( PARTITION BY team_id ) AS team_size
FROM
employee
-
方法三:相关子查询
需要把这两个字段关联到一张表里,已知表有employee_id、team_id,计算team_size的过程中可以得到一个表,加上team_id,因此可以通过team_id关联两个表
SELECT employee_id, (
SELECT COUNT(*)
FROM employee e2
WHERE e1.team_id = e2.team_id
) AS team_size
FROM Employee e1
ORDER BY e1.employee_id;