Sql oracle查询,为记录集选择组中上次更新的记录
我有一个Oracle表,如下所示Sql oracle查询,为记录集选择组中上次更新的记录,sql,oracle,oracle11g,Sql,Oracle,Oracle11g,我有一个Oracle表,如下所示 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-
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
列将更改
用户将传递订单号以获取订单的最新订单名、开始和结束日期
我需要如下查询结果(如果用户通过100200和300)
我正在使用下面的查询,但无法获取每个订单组的上次更新记录,需要在子查询中框显哪些内容:
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,您还可以添加一个带有REGEXP\u LIKE
的WHERE
子句:
WHERE REGEXP_LIKE(OrderName, '^Ord-(200|300)-')
然而,在这一点上,我要指出的是,如果您需要为这样一个简单的需求大量使用regex,那么您可能需要重新考虑您的表设计。相反,您可能希望为专用订单名称维护一个单独的列,这将使编写查询变得更简单、更快,并消除以这种方式使用正则表达式的需要。谢谢Tim,上面的查询将为整个表使用正则表达式。。如何只获取100和200阶或100和300阶,查看更新的答案,也可能考虑更改表的设计。对于相同的LASTUPDATE DATE,ORDRONNEXT更改有OrrordNeXT更改,但是OrrNeND序列更改了,请您解决这个场景,我不理解您的场景,很遗憾,我无法解决这个问题。我已经更新了问题描述中的fiddle代码,返回到原始问题。这个网站不是这样工作的,你会根据进一步的要求不断地修改问题。我已经发布了fiddle代码来理解我的要求,我不知道如何更新演示fiddle将fiddle链接粘贴到这里,并清楚地说明问题,我可以看一看。对于某些记录,ordername将不同,lastupdate相同。如何获取最新的ordername。如果我通过lastupdate desc查询订单,我将获得100条记录的订单名为ord-100-A3,但您的查询显示为“ord-100-A2”,谢谢Tim。你的反应很好。我也会考虑换桌。
WHERE REGEXP_LIKE(OrderName, '^Ord-(200|300)-')