如何根据CREATED_DT<以下步骤将下面的非结构化表拆分为500个记录。 SYSDATE -2考虑到有超过90,000条记录?我不能把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
我无法使用MAX(NUMBER_ID)
MIN(NUMBER_ID)
和CREATED_DT
的差异,因为某些数据丢失的风险很高。我可以使用Oracle ROWID
列(系统列)列来拆分记录而不会丢失任何记录吗?
感谢您的帮助!
答案 0 :(得分: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
...