2017-01-03 7 views
0

Oracleデータベースに、859188_1、859188_2、859188_3、...、859188_nのような値を持つIDという列があります。 '_'の後の値はバッチ番号、つまり1、2、3、...、nです。このバッチ番号に基づいて最小IDを選択する必要があります。最小値は859188_1です。バッチ番号で構成される文字列から最小値を見つけるOracle SQLクエリ

+2

を見ての通り今これは恐ろしいDBデザインです。テーブル構造を変更することはできますか? –

+0

実際、ペイロードは大きく、Oracle Serviceによってバッチで分割され、SOAに送信されます。最初の値には出荷数が含まれ、2番目の値には分割バッチ番号が含まれます。表全体は、方法。 – user7371032

+0

私は前にDBシーケンスに基づいてIDを持っていたし、うまくいきました。今度はデザインが変更されました。 – user7371032

答えて

0

はあなたが_後部分に基づいて最小を選択する必要があります...

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

ありがとうございます、これは期待通りに機能しました。 – user7371032

+0

私はそれをちょっと微調整しようとしていました。 flag.Exampleに基づいて異なる出荷番号のうちの最小値を選択したかった:出荷番号がある場合: XXXXX_1フラグ - C XXXXX_2フラグ - N XXXXX_3フラグ - N yyyyyy_1フラグ - C yyyyyy_2フラグ - N yyyyyy_3フラグ-N また、フラグはフラグ= 'N'のフラグに基づいています。 結果はXXXXX_2とyyyyyy_2である必要があります – user7371032

0

を試してみてください。

場合は - あなたの例のように - 最初の6つの文字がすべて同じである、あなたは簡単に行うことができます。

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

おそらく、このような何か...

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 
関連する問題