Oracle分组取最新的一条数据

Oracle分组取最新的一条数据

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()函数和子查询来实现。具体步骤如下:

  1. 构造子查询,在子查询中按照需要进行排序,并使用ROW_NUMBER()函数为每条记录生成一个序号。
  2. 在主查询中,将子查询作为一个内嵌表,使用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()函数和子查询,我们可以便捷地完成该功能。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程