SQL Server 筛选表中每个人的最新数据

在日常数据库操作中,我们经常需要从表中筛选出每个人的最新数据。比如在员工数据表中,我们可能需要筛选出每个员工最近一次的工作记录。本文将介绍如何使用 SQL Server 实现这一功能。

创建示例表

首先,我们需要创建一个示例表,用于演示如何筛选每个人的最新数据。假设我们有一个员工工作记录表,包含以下字段:

  • id:记录的唯一标识符
  • employee_id:员工的唯一标识符
  • work_date:工作日期
  • work_hours:工作小时数

我们可以使用以下 SQL 代码创建示例表:

CREATE TABLE employee_work (
    id INT PRIMARY KEY,
    employee_id INT,
    work_date DATE,
    work_hours DECIMAL(5, 2)
);

然后,我们可以向表中插入一些示例数据:

INSERT INTO employee_work (id, employee_id, work_date, work_hours)
VALUES
    (1, 1, '2022-01-01', 8.5),
    (2, 1, '2022-01-02', 7.5),
    (3, 2, '2022-01-01', 6.0),
    (4, 2, '2022-01-02', 8.0),
    (5, 3, '2022-01-01', 8.0);

现在,我们已经创建了示例表并插入了一些数据,接下来我们将介绍如何筛选每个员工的最新工作记录。

使用窗口函数筛选最新数据

在 SQL Server 中,我们可以使用窗口函数来实现筛选每个员工的最新数据。窗口函数是一种特殊的函数,它可以在查询的结果集中进行计算和排序。

我们可以使用以下 SQL 代码来筛选每个员工的最新工作记录:

SELECT id, employee_id, work_date, work_hours
FROM (
    SELECT id, employee_id, work_date, work_hours,
        ROW_NUMBER() OVER (PARTITION BY employee_id ORDER BY work_date DESC) AS row_num
    FROM employee_work
) AS subquery
WHERE row_num = 1;

在上面的示例代码中,我们使用了窗口函数 ROW_NUMBER() 来为每个员工的工作记录排序,并使用 PARTITION BY 子句将记录按照 employee_id 分组。然后,我们使用外部查询筛选出每个分组中 row_num 为 1 的记录,即每个员工的最新工作记录。

示例结果

运行上面的 SQL 代码后,我们将获得以下结果:

id employee_id work_date work_hours
2 1 2022-01-02 7.5
4 2 2022-01-02 8.0
5 3 2022-01-01 8.0

上面的结果表格显示了每个员工的最新工作记录。可以看到,每个员工的最新工作记录已成功地被筛选出来。

总结

通过使用窗口函数,我们可以轻松地筛选出表中每个人的最新数据。在 SQL Server 中,ROW_NUMBER() 窗口函数可以帮助我们对记录进行排序并为每个分组分配唯一的行号,从而实现最新数据的筛选。

希望本文对你了解如何在 SQL Server 中筛选表中每个人的最新数据有所帮助。如果你有任何问题或疑问,请随时提问。祝你在数据库操作中取得成功!

classDiagram
    class employee_work {
        +id INT PRIMARY KEY
        +employee_id INT
        +work_date DATE
        +work_hours DECIMAL(5, 2)
    }
erDiagram
    employee_work ||..|| employee : has

![类图和关系图](