3,491
社区成员
发帖
与我相关
我的任务
分享
declare
i int := 0;
x int := 1;
begin
execute immediate 'create table test_m_' || x || '(ord number, money number)';
for cur in (select t1.ord, t1.money from test_190319 t1 order by t1.ord) loop
i := i + cur.money;
if i >= 1000 then
i := cur.money;
x := x + 1;
execute immediate 'create table test_m_' || x || '(ord number, money number)';
end if;
execute immediate 'insert into test_m_' || x || ' values(' || cur.ord || ', ' || cur.money || ')';
commit;
end loop;
end;
select*from test_190319
model
dimension by(ord)
measures(money, 1 t_id, 0 smm, 0 flag)
(
flag[ord] = money[cv()],
smm[ord] = case when decode(nvl(smm[cv() - 1], 0), 0, flag[cv() - 1], nvl(smm[cv() - 1], 0)) + money[cv()] >= 1000 then 0 else nvl(smm[cv() - 1], 0) + money[cv()] end,
t_id[ord] = case when smm[cv() ] = 0 then nvl(t_id[cv() - 1], 1) + 1 else nvl(t_id[cv() - 1], 1) end
)
;
declare
i int := 0;
x int := 1;
begin
execute immediate 'create table test_m_' || x || '(ord number, money number)';
for cur in (select t1.ord, t1.money from test_190319 t1 order by t1.ord) loop
i := i + cur.money;
if i >= 1000 then
i := 0;
x := x + 1;
execute immediate 'create table test_m_' || x || '(ord number, money number)';
end if;
execute immediate 'insert into test_m_' || x || ' values(' || cur.ord || ', ' || cur.money || ')';
end loop;
end;
dimension by(row_number() over(order by ord) ord)
create table test_190319(ord number, money number);
select 1, 100 from dual union all
select 2, 800 from dual union all
select 3, 200 from dual union all
select 4, 100 from dual union all
select 5, 2000 from dual union all
select 6, 500 from dual
;
insert into test_190319
select 1, 100 from dual union all
select 2, 800 from dual union all
select 3, 200 from dual union all
select 4, 100 from dual union all
select 5, 2000 from dual union all
select 6, 500 from dual ;
create table test_190319_temp as
select*from test_190319
model
dimension by(ord)
measures(money, 1 t_id, 0 smm)
(
smm[ord] = case when nvl(smm[cv() - 1], 0) + money[cv()] >= 1000 then 0 else nvl(smm[cv() - 1], 0) + money[cv()] end,
t_id[ord] = case when smm[cv() - 1] = 0 then nvl(t_id[cv() - 1], 1) + 1 else nvl(t_id[cv() - 1], 1) end
)
;
select*from test_190319_temp;
declare
i int := 0;
x int;
begin
select max(t_id) into x from test_190319_temp;
for i in 1..x loop
execute immediate 'create table test_m_' || i || ' as select ord, money from test_190319_temp where t_id = ''' || i || '''';
end loop;
end;
select*from test_m_1;
select*from test_m_2;
select*from test_m_3;
drop table test_m_1;
drop table test_m_2;
drop table test_m_3;