oracle 查询一组记录中的 select 最后更新的记录

oracle Query to select last updated record in a group for set of records

我有一个 Oracle table 如下

OrderName      StartDate   EndDate     Lastupdate
--------------------------------------------------
Ord-100-A1     01-Jan-20   01-Feb-20   02-Mar-20
Ord-100-A2     05-Mar-20   05-Apr-20   03-Apr-20
Ord-200-A1     10-Apr-20   10-May-20   04-May-20
Ord-200-A2     15-May-20   15-Jun-20   05-Jun-20
Ord-300-A1     20-Jun-20   20-Jul-20   06-Jul-20
Ord-300-A2     25-Jul-20   25-Aug-20   07-Aug-20

在任何列更改(开始和结束日期)时,Lastupdateordername 列将更改。

用户通过订单号获取最新的订单名称、起止日期,

我需要如下查询结果(如果用户通过100,200和300)

OrderName      StartDate   EndDate     
-------------------------------------
Ord-100-A2     05-Mar-20   05-Apr-20 
Ord-200-A2     15-May-20   15-Jun-20
Ord-300-A2     25-Jul-20   25-Aug-20

我正在使用以下查询,但无法获取每个订单组的最后更新记录,需要在子查询中加框:

Select 
    OrderName, startDate, EndDate 
from 
    orders 
where 
    substr(ordername, 5, 3) in ('100', '200', '300') 
group by 
    OrderName, startDate, EndDate 
order by 
    lastupdate desc

我们可以通过一些正则表达式支持来处理这个要求:

WITH cte AS (
    SELECT o.*, ROW_NUMBER() OVER (PARTITION BY REGEXP_SUBSTR(OrderName, '^Ord-\d+')
                                   ORDER BY Lastupdate DESC) rn
    FROM orders o
)

SELECT OrderName, StartDate, EndDate
FROM cte
WHERE rn = 1;

Demo

如果您只是想限制为例如订单 200 和 300,您还可以添加 WHERE 子句 REGEXP_LIKE:

WHERE REGEXP_LIKE(OrderName, '^Ord-(200|300)-')

但是,此时我要评论说,如果您需要大量使用正则表达式来满足如此简单的要求,您可能需要重新考虑您的 table 设计。相反,您可能希望为专用订单名称维护一个单独的列,这将使编写查询更容易、更快,并且无需以这种方式使用正则表达式。