Oracle SQL查询,从包含批号的字符串中查找最小值

Oracle SQL查询,从包含批号的字符串中查找最小值,sql,oracle,Sql,Oracle,我的Oracle数据库中有一个名为ID的列,它是一个字符串,具有859188_1、859188_2、859188_3、…、859188_n等值。“u”后面的值是批号,即1、2、3、…、n。我需要根据此批号选择最小id。此处最小值为859188_1 试试 select id from yourTable where to_number(regexp_substr(ID, '[^_]+$')) = (select min(to_number(regexp_substr(t2.ID, '[

我的Oracle数据库中有一个名为ID的列,它是一个字符串,具有859188_1、859188_2、859188_3、…、859188_n等值。“u”后面的值是批号,即1、2、3、…、n。我需要根据此批号选择最小id。此处最小值为859188_1

试试

 select id
 from yourTable
 where to_number(regexp_substr(ID, '[^_]+$')) =
   (select min(to_number(regexp_substr(t2.ID, '[^_]+$')))
    from yourTable t2
   )

您需要根据
后面的部分选择最小值

如您的示例所示,如果前六个字符都相同,您只需执行以下操作:

select min(id) keep (dense_rank first order by length(id) asc, id asc) as min_id
from t;

也许是这样的

with
     inputs ( id ) as (
       select '100_1'  from dual union all
       select '100_3'  from dual union all
       select '100_12' from dual union all
       select '101_3'  from dual union all
       select '101_5'  from dual union all
       select '101_9'  from dual
     )
-- end of test data; solution (SQL query) begins below this line
select   min(id) keep (dense_rank first 
                       order by to_number(substr(id, instr(id, '_') + 1))) as id
from     inputs
group by substr(id, 1, instr(id, '_') - 1)
;

ID
-----
100_1
101_3

正如您现在看到的,这是一个可怕的DB设计。您可以更改表结构吗?实际上,有效负载很大,由Oracle服务分批拆分并发送到SOA。第一个值包含装运编号,第二个值是拆分的批次编号。整个表以序列化的方式显示出来,用于控制流。我以前有基于DB序列的ID它工作得很好。现在设计已经改变了。是Oracle 12c版本1还是更高版本?你说的“基于此批号的最小id”是什么意思?如您所示,ID结合了“装运编号”和“批号”。您是否有多个装运,并且对于每个装运,您需要选择具有最低批号的ID?还是什么?我只是想稍微调整一下。希望根据标志从不同的装运编号中选择最小值。例如:如果装运编号为:XXXXX\u 1标志-C XXXXX\u 2标志-N XXXXX\u 3标志-N YYYY\u 1标志-C YYYY\u 2标志-N yyyyyy\u 3标志-N,则过滤器也基于标志,其中标志为'N'。这里的结果应该是XXXXX _2和yyyyy _2