1、假设有一个员工表,包含员工编号(emp_id)、员工姓名(emp_name)、员工所属部门编号(dept_id)和员工入职时间(join_date)四个字段。请编写 SQL 语句,查询出每个部门的最早入职员工信息。写出所有不重复的方法及每个方法的思路解析
时间: 2024-03-06 21:46:39 浏览: 147
部门员工表添加数据.sql
方法一:使用子查询和聚合函数
```
SELECT emp_id, emp_name, dept_id, join_date
FROM employee
WHERE (dept_id, join_date) IN (
SELECT dept_id, MIN(join_date)
FROM employee
GROUP BY dept_id
)
```
该查询使用子查询和聚合函数来查找每个部门的最早入职员工。内部子查询用于查找每个部门的最早入职日期,然后外部查询使用该日期和部门 ID 来获取对应的员工记录。
方法二:使用窗口函数
```
SELECT emp_id, emp_name, dept_id, join_date
FROM (
SELECT emp_id, emp_name, dept_id, join_date,
ROW_NUMBER() OVER (PARTITION BY dept_id ORDER BY join_date) AS rn
FROM employee
) t
WHERE t.rn = 1
```
该查询使用窗口函数 `ROW_NUMBER()` 来为每个部门的员工记录分配一个行号,然后筛选每个部门的第一条记录(即最早入职员工记录)。
方法三:使用连接查询
```
SELECT e1.emp_id, e1.emp_name, e1.dept_id, e1.join_date
FROM employee e1
LEFT JOIN employee e2 ON e1.dept_id = e2.dept_id AND e1.join_date > e2.join_date
WHERE e2.emp_id IS NULL
```
该查询使用自连接查询,将每个员工与他们所在部门的其他员工进行比较,筛选出每个部门最早入职的员工记录。具体地,左连接查询将每个员工与他们所在部门的其他员工连接起来,然后使用 `WHERE` 子句排除那些存在比他们入职更早的其他员工记录的员工记录。
以上是三种不同的方法,可以根据实际情况选择最适合的方法。
阅读全文