2016-08-03 7 views
0

以下の非構造化テーブルを、CREATED_DTに基づく各バッチの500レコードに分割する方法< SYSDATE -2では、90,000以上のレコードがあると考えますか?私はちょうど日付としてCREATED_DTを取ることができないと値が失われているいくつかのデータの危険性が高いと私はMAX(NUMBER_ID)MIN(NUMBER_ID)CREATED_DTの違いを使用することはできません非構造化テーブルからのシーケンスの作成

NUMBERID | MODEL| NAME | VALUE | CREATED_DT | LOADED_DT 
1000  | BOE | AGT | 300 | 02-AUG-2016| 02-AUG-2016 
1001  | AIR | ACT | 400 | 01-AUG-2016| 01-AUG-2016 
1000  | EMB | ADT | 500 | 02-AUG-2016| 01-AUG-2016 
1004  | REL | GTR | 140 | 01-AUG-2016| 01-AUG-2016 
1001  | SIM | HJT | 140 | 01-JUL-2016| 28-JUL-2016 
1002  | SIM | ACT | 540 | 04-JUL-2016| 04-JUL-2016 

を変更します。 Oracle ROWID列(システム列)の列を使用してレコードを抜けずにレコードを分割できますか?

ありがとうございました!

答えて

2

分析関数ROW_NUMBERは、行を一意に並べてチャンクするのに役立ちます。

サンプル・スキーマ

drop table test1; 

create table test1(numberid number, created_dt date); 

insert into test1 
select level, sysdate - level * interval '1' second 
from dual connect by level <= 100000; 

サンプルクエリと結果

select 
    numberid, 
    created_dt, 
    ceil(row_number() over (order by created_dt desc)/500) batch_id 
from test1 
order by created_dt desc; 


NUMBERID CREATED_DT    BATCH_ID 
-------- ----------    -------- 
1   2016-08-02 11:42:48 PM 1 
2   2016-08-02 11:42:47 PM 1 
3   2016-08-02 11:42:46 PM 1 
... 
499  2016-08-02 11:34:30 PM 1 
500  2016-08-02 11:34:29 PM 1 
501  2016-08-02 11:34:28 PM 2 
... 
+0

ありがとうございました!これは完全に動作します! –

+0

@ jonheller1 "trunc((row_number()over(order by created_dt desc) - 1)/ 500)+ 1 batch_id"で " - 1"を実行している理由を教えてください。 –

+0

@Cool_Oracleオフ・バイ・ワンのエラーを処理することでした。しかし、CEILでは少しシンプルなので、私は少し答えを変えました。 –