2017-10-12 10 views
0

私はロジスティクスカンパニーの仕事をしており、各貨物には7桁のプロナンバーをあらかじめ決められた順序で持っていなければなりません。だから私たちは数字に隙間があることを知っていますが、システムを照会して何が欠けているかを知る方法はありますか?テーブルに不足している数字をクエリできる方法はありますか?

したがって、列名trace_numberに存在しない1000000〜2000000の数字をすべて表示してください。

このように、シーケンスは1024397,1024398,1051152になりますので、26kプロ番号のかなりの差があることがわかりますが、それでもギャップを照会するにはどうしますか?

enter image description here

Select t.trace_number, 
integer(trace_number) as number, 
ISNUMERIC(trace_number) as check 

from trace as t 
left join tlorder as tl on t.detail_number = tl.detail_line_id 


where left(t.trace_number,1) in ('0','1','2','3','4','5','6','7','8','9') 
and date(pick_up_by) >= current_date - 1 years 
and length(t.trace_number) = 7 
and t.trace_type = '2' 
and site_id in ('SITE5','SITE9','SITE10') 
and ISNUMERIC(trace_number) = 'True' 


order by 2 
fetch first 10000 rows only 
+0

ではなく、私が...コメントとしてそれを残して一時テーブルを作成し、移入ますので、かなりの答えそれは1000000から2000000までのあらゆる数で(単純なループを使用してデータを取り込みます)このテンポラリテーブルを持ち、traceへの結合をleftにすると、trace.tracenumberがnullの場合、すべての '未使用'の番号が返されます。 – Twelfth

+1

PostgreSQLでは、各ギャップ範囲の開始点を取得するために 'SELECT t.trace_number + 1 FROM trace t WHERE NOT EXISTS(SELECT 1 FROM trace as t2 WHERE t2.trace_number = t.trace_number + 1)'を使うことができます。おそらくDB2は同様のことを許しています。同様のクエリがエンドポイントを取得する可能性があります。この2つのクエリを 'UNION 'し、' trace_number'でソートすることで、奇数行のギャップ開始位置と偶数行のギャップ終了位置を取得できます。 –

+1

かなり一般的な問題、google * sqlのギャップと島* – Charles

答えて

2

私はあなたのクエリは、質問と関係しているかわからないんだけど、あなたはlag()/lead()を使用してギャップを特定することができます。考えは:

select (trace_number + 1) as start_gap, 
     (next_tn - 1) as end_gap 
from (select t.*, 
      lead(trace_number) order by (trace_number) as next_tn 
     from t 
    ) t 
where next_tn <> trace_number + 1; 

これは範囲内にありません。それはちょうどすべてのギャップを見つける。

+0

私はおそらくこのアプローチを取るだろう –

1

は(WHERE条件、「オン」句に入れ適応)このような何かを試してみてください。

with Range (nb) as (         
values 1000000             
union all             
select nb+1 from Range         
where nb<=2000000           
)               
select *             
from range f1 left outer join trace f2  
on f2.trace_number=f1.nb         
and f2.trace_number between 1000000 and 2000000     
where f2.trace_number is null  
関連する問題