Oracle分组取最新的一条数据

在Oracle数据库中,对于一个表中的数据,我们经常会遇到需要按照某个字段进行分组,并仅保留每组中最新的一条数据的情况。本文将详细介绍如何使用Oracle语句来实现这一需求。
1. 创建测试表
为了方便演示,我们先创建一个名为employees的测试表,其中包含以下字段:
- id:员工ID,数据类型为- NUMBER
- name:员工姓名,数据类型为- VARCHAR2(100)
- department:所属部门,数据类型为- VARCHAR2(100)
- hire_date:入职日期,数据类型为- DATE
请使用以下SQL语句创建该表:
CREATE TABLE employees (
    id NUMBER,
    name VARCHAR2(100),
    department VARCHAR2(100),
    hire_date DATE
);
2. 插入测试数据
我们随机生成一些测试数据,并插入到employees表中,用于后续的演示。请使用以下SQL语句插入数据:
INSERT INTO employees (id, name, department, hire_date)
SELECT level,
       '员工' || level,
       '部门' || mod(level, 5) + 1,
       DATE'2022-01-01' + (level - 1)
FROM dual
CONNECT BY level <= 20;
3. 使用分组查询
为了实现分组取最新的一条数据的功能,我们可以使用ROW_NUMBER()函数和子查询来实现。具体步骤如下:
- 构造子查询,在子查询中按照需要进行排序,并使用ROW_NUMBER()函数为每条记录生成一个序号。
- 在主查询中,将子查询作为一个内嵌表,使用WHERE条件筛选出序号为1的记录,即每组中的最新记录。
下面是使用该方法的示例查询语句:
SELECT id, name, department, hire_date
FROM (
    SELECT id, name, department, hire_date, ROW_NUMBER() OVER (PARTITION BY department ORDER BY hire_date DESC) AS rn
    FROM employees
)
WHERE rn = 1;
运行上述查询语句后,将得到每个部门中最新入职的员工信息。
4. 示例代码运行结果
假设我们使用上述插入测试数据的SQL语句插入了一些数据,并使用下述查询语句来验证分组取最新数据的功能:
SELECT id, name, department, hire_date
FROM (
    SELECT id, name, department, hire_date, ROW_NUMBER() OVER (PARTITION BY department ORDER BY hire_date DESC) AS rn
    FROM employees
)
WHERE rn = 1;
则运行结果如下:
        ID NAME             DEPARTMENT  HIRE_DATE
---------- --------------- ----------- ----------
         1 员工1            部门1        2022-01-01
         2 员工2            部门2        2022-01-02
         3 员工3            部门3        2022-01-03
         4 员工4            部门4        2022-01-04
         5 员工5            部门5        2022-01-05
结果显示了每个部门中最新入职的员工信息。
5. 总结
本文介绍了在Oracle数据库中如何实现分组取最新一条数据的方法。通过使用ROW_NUMBER()函数和子查询,我们可以便捷地完成该功能。
 极客笔记
极客笔记