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
在任何列更改(开始和结束日期)时,Lastupdate
和 ordername
列将更改。
用户通过订单号获取最新的订单名称、起止日期,
我需要如下查询结果(如果用户通过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;
如果您只是想限制为例如订单 200 和 300,您还可以添加 WHERE
子句 REGEXP_LIKE
:
WHERE REGEXP_LIKE(OrderName, '^Ord-(200|300)-')
但是,此时我要评论说,如果您需要大量使用正则表达式来满足如此简单的要求,您可能需要重新考虑您的 table 设计。相反,您可能希望为专用订单名称维护一个单独的列,这将使编写查询更容易、更快,并且无需以这种方式使用正则表达式。
我有一个 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
在任何列更改(开始和结束日期)时,Lastupdate
和 ordername
列将更改。
用户通过订单号获取最新的订单名称、起止日期,
我需要如下查询结果(如果用户通过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;
如果您只是想限制为例如订单 200 和 300,您还可以添加 WHERE
子句 REGEXP_LIKE
:
WHERE REGEXP_LIKE(OrderName, '^Ord-(200|300)-')
但是,此时我要评论说,如果您需要大量使用正则表达式来满足如此简单的要求,您可能需要重新考虑您的 table 设计。相反,您可能希望为专用订单名称维护一个单独的列,这将使编写查询更容易、更快,并且无需以这种方式使用正则表达式。