Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql oracle查询,为记录集选择组中上次更新的记录_Sql_Oracle_Oracle11g - Fatal编程技术网

Sql 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-

我有一个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-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)-')