我正在尝试根据选择记录时添加的页数返回大量记录。页数会有所不同,但我希望每个批次返回的页数都在一个范围内。像这样......
DATA
PRINT ID PAGE_COUNT STATUS
1000 50 READY
1001 50 READY
1002 50 READY
1003 75 READY
select PRINT_ID, PAGE_COUNT,STATUS from PRINT_JOB
where STATUS = 'READY' and
sum (page_count)>100 and sum(page_count)<200
RETURNED
PRINT_ID PAGE COUNT STATUS
1000 50 READY
1001 50 READY
1002 50 READY
我尝试过HAVING并使用子查询。它似乎只是将页面数量落在范围内的单个部分带回来,而不是总计页面总数。有什么想法吗?
答案 0 :(得分:0)
如果可以按照PRINT_ID
的顺序对记录进行分组,那么每个组都有SUM(PAGE_COUNT)&gt; 100(或表末尾的其余记录);这里有一个使用recursive subquery factoring
在第一步中,我将顺序ID
添加到与PRINT_ID相同的表中,该表将用于递归。
create table TAB_DATA as
select print_id, page_count,
row_number() over (order by print_id) as id
from data;
select * from tab_data order by id;
PRINT_ID PAGE_COUNT ID
---------- ---------- ----------
1000 50 1
1001 50 2
1002 50 3
1003 75 4
初始子查询将控制器acc
设置为零并初始化第一组。递归子查询执行检查限制和增加组ID的逻辑。
with dt(id, print_id, page_count, acc, grp) as (
select id, print_id, page_count, 0 acc, 1 grp from tab_data where id = 1
union all
select tab_data.id, tab_data.print_id, tab_data.page_count,
-- accumulate
case when
dt.acc+dt.page_count > 100 then /* new group, reset acc */ 0
else dt.acc+dt.page_count end as acc,
-- define group
case when
dt.acc+dt.page_count > 100 then /* increase group */ grp+1
else grp end as grp
from tab_data, dt
where tab_data.id=dt.id+1)
select * from dt
;
按要求返回
ID PRINT_ID PAGE_COUNT ACC GRP
---------- ---------- ---------- ---------- ----------
1 1000 50 0 1
2 1001 50 50 1
3 1002 50 100 1
4 1003 75 0 2
我没有考虑第二个限制<200。但我希望这能为您提供如何优化规则以实现它的想法。