3

カラム serialnumber を持つテーブル productSerialnumber を考えてみましょう。この列は、製品の単一のシリアル番号を取ります。

製品 A のシリアル番号は 101 から 109、次に 111 から 119、139 から 150 です。たとえば、シリアル番号 110 と 120-138 は使用できません。

連続したシリアル番号を返すクエリか何かを設定したいと思います。たとえば、結果は次のようになります

from       to 
=======    ====
101        109
111        119
139        150

考慮すべきことは、テーブルに100万行を超える膨大なデータセットがあることです。

どんな助けでも本当に感謝します

4

2 に答える 2

0

結合を避け、データを 1 回だけ反復処理するため、これは私の意見では非常に高速です。唯一のボトルネックは、2 つの一時テーブルを使用し、ユーザー定義の値を使用する必要があることです。

setステートメントなし

select START_INTERVAL+0, END_INTERVAL+0
from
(
  select 
  if(@start = NULL or @start > PRODUCTSERIALNUMBER, @start='', '') as SET_START,
  if (@start = '', @start:= @previous, @start) as START_INTERVAL,
  if(PRODUCTSERIALNUMBER - @previous > 1, concat(@end:=@previous,@start:=''), @end:='') as END_INTERVAL,
  @previous:= PRODUCTSERIALNUMBER as PRODUCTSERIALNUMBER
  from 
  (
    select min(PRODUCTSERIALNUMBER)-2 as PRODUCTSERIALNUMBER from Product
    UNION
    (select PRODUCTSERIALNUMBER as PRODUCTSERIALNUMBER from Product ORDER BY productSerialnumber)
    UNION
    select max(PRODUCTSERIALNUMBER)+2 as PRODUCTSERIALNUMBER from Product    
  ) as TEMP
)
as RESULTS where 
not START_INTERVAL is null AND
not END_INTERVAL is null AND
not END_INTERVAL = '' AND
not START_INTERVAL - END_INTERVAL > 0;

Set ステートメントあり

set @start='';

select select START_INTERVAL+0, END_INTERVAL+0
from
(
  select 
  if (@start = '', @start:= @previous, @start) as START_INTERVAL,
  if(PRODUCTSERIALNUMBER - @previous > 1, concat(@end:=@previous,@start:=''), @end:='') as END_INTERVAL,
  @previous:= PRODUCTSERIALNUMBER as PRODUCTSERIALNUMBER
  from 
  (
    select min(PRODUCTSERIALNUMBER)-2 as PRODUCTSERIALNUMBER from Product
    UNION
    (select PRODUCTSERIALNUMBER as PRODUCTSERIALNUMBER from Product ORDER BY productSerialnumber)
    UNION
    select max(PRODUCTSERIALNUMBER)+2 as PRODUCTSERIALNUMBER from Product    
  ) as TEMP
)
as RESULTS where 
not RESULTS.START_INTERVAL is null AND
not RESULTS.END_INTERVAL is null AND
not RESULTS.END_INTERVAL = '' AND
not RESULTS.START_INTERVAL - RESULTS.END_INTERVAL > 0;

SQLFiddle: http://sqlfiddle.com/#!2/a622a/60

于 2013-10-08T08:13:08.390 に答える