Pan*_*tea 5 oracle oracle-11g-r2
我有一个结构如下的表:
create table item_test
(item_id varchar2(10),
item_row number)
Run Code Online (Sandbox Code Playgroud)
示例数据如下所示,请注意Item_Row
列中的数字从 1 开始,然后加 1 到没有任何间隙的数字。我需要做的是([1-100] , [101-200] , [201-300] ,......)
为每个创建 100 的间隔Item_Id
。
Item_Id Item_Row
------------ -----------
A 1
A 2
A ...
A ...
A 236 /* Item_Row starts from 1 and continues to 236 */
B 1
B ...
B ...
B 173 /* Item_Row starts from 1 and continues to 173 */
C 1
C 2
C ...
C ...
C 300 /* Item_Row starts from 1 and continues to 300 */
Run Code Online (Sandbox Code Playgroud)
结果如下:
Item_Id RowNum_From RowNum_From
------------ ----------- -----------
A 1 100
A 101 200
A 201 236
B 1 100
B 101 173
C 1 100
C 101 200
C 201 300
Run Code Online (Sandbox Code Playgroud)
有什么具体的功能吗?
Phi*_*erg 10
诀窍是使用该trunc
函数。
这是使用纯 SQL 的解决方案:
create table item_test
(item_id varchar2(10),
item_row number);
insert into item_test
select 'A', level from dual connect by level <= 236
union all
select 'B', level from dual connect by level <= 173
union all
select 'C', level from dual connect by level <= 300;
commit;
select item_id, min(item_row) as item_row_from, max(item_row) as item_row_to
from item_test
group by item_id, trunc(item_row-1, -2)
order by item_id, trunc(item_row-1, -2);
Run Code Online (Sandbox Code Playgroud)
结果:
ITEM_ID ITEM_ROW_FROM ITEM_ROW_TO
---------- ------------- -----------
A 1 100
A 101 200
A 201 236
B 1 100
B 101 173
C 1 100
C 101 200
C 201 300
8 rows selected.
Run Code Online (Sandbox Code Playgroud)