gpt4 book ai didi

sql - (Oracle) 如何对行进行分组以进行分页

转载 作者:行者123 更新时间:2023-12-01 23:31:02 25 4
gpt4 key购买 nike

我有一个表格,其输出与此类似(尽管以数千为单位):

     EMPNO ENAME      TRANDATE      AMT
---------- ---------- --------- -------
100 Alison 21-MAR-96 45000
100 Alison 12-DEC-78 23000
100 Alison 24-OCT-82 11000
101 Linda 15-JAN-84 16000
101 Linda 30-JUL-87 17000
102 Celia 31-DEC-90 78000
102 Celia 17-SEP-96 21000
103 James 21-MAR-96 45000
103 James 12-DEC-78 23000
103 James 24-OCT-82 11000
104 Robert 15-JAN-84 16000
104 Robert 30-JUL-87 17000

我想要的输出与此类似:

     EMPNO ENAME      TRANDATE      AMT PAGE
---------- ---------- --------- ------- ----
100 Alison 21-MAR-96 45000 1
100 Alison 12-DEC-78 23000 1
100 Alison 24-OCT-82 11000 1
101 Linda 15-JAN-84 16000 2
101 Linda 30-JUL-87 17000 2
102 Celia 31-DEC-90 78000 2
102 Celia 17-SEP-96 21000 2
103 James 21-MAR-96 45000 3
104 Robert 12-DEC-78 23000 4
104 Robert 24-OCT-82 11000 4
104 Robert 15-JAN-84 16000 4
104 Robert 30-JUL-87 17000 4

基本上,它应该插入一个新字段来标识它所属的页面。分页符基于行。并且,就像 EMPNO 中“保持在一起”一样,当行无法添加下一个 EMPNO 批处理时,它会向 PAGE 添加 1。这是针对 Excel 的限制,因为 Excel 不允许在单个工作表中包含超过 65000 行(左右)。在示例中,只有 4 行。限制数量是静态的。

最佳答案

ThinkJet 是对的,其他一些答案不符合“保持在一起”的要求。不过我认为这可以在不诉诸用户定义的聚合的情况下完成。

示例数据

create table test (empno number, ename varchar2(20), trandate date, amt number);
insert into test values (100, 'Alison' , to_date('21-MAR-1996') , 45000);
insert into test values (100, 'Alison' , to_date('12-DEC-1978') , 23000);
insert into test values (100, 'Alison' , to_date('24-OCT-1982') , 11000);
insert into test values (101, 'Linda' , to_date('15-JAN-1984') , 16000);
insert into test values (101, 'Linda' , to_date('30-JUL-1987') , 17000);
insert into test values (102, 'Celia' , to_date('31-DEC-1990') , 78000);
insert into test values (102, 'Celia' , to_date('17-SEP-1996') , 21000);
insert into test values (103, 'James' , to_date('21-MAR-1996') , 45000);
insert into test values (103, 'James' , to_date('12-DEC-1978') , 23000);
insert into test values (103, 'James' , to_date('24-OCT-1982') , 11000);
insert into test values (104, 'Robert' , to_date('15-JAN-1984') , 16000);
insert into test values (104, 'Robert' , to_date('30-JUL-1987') , 17000);

现在,确定每个 empno 段的结束行(使用 RANK 查找开头,使用 COUNT..PARTITION BY 查找段中的编号)。

然后使用 APC 解决方案中的 ceil/4 将它们分组到“页面”中。同样,正如 ThinkJet 所指出的,规范中存在一个问题,因为它不能满足 empno“保持在一起”段中的记录多于页面所能容纳的情况的情况。

select empno, ename,
ceil((rank() over (order by empno) +
count(1) over (partition by empno))/6) as chunk
from test
order by 1;
<小时/>

正如 ThinkJet 所指出的,该解决方案并非万无一失。

drop table test purge;

create table test (empno number, ename varchar2(20), trandate date, amt number);
declare
cursor csr_name is
select rownum emp_id,
decode(rownum,1,'Alan',2,'Brian',3,'Clare',4,'David',5,'Edgar',
6,'Fred',7,'Greg',8,'Harry',9,'Imran',10,'John',
11,'Kevin',12,'Lewis',13,'Morris',14,'Nigel',15,'Oliver',
16,'Peter',17,'Quentin',18,'Richard',19,'Simon',20,'Terry',
21,'Uther',22,'Victor',23,'Wally',24,'Xander',
25,'Yasmin',26,'Zac') emp_name
from dual connect by level <= 26;
begin
for c_name in csr_name loop
for i in 1..11 loop
insert into test values
(c_name.emp_id, c_name.emp_name, (date '2010-01-01') + i,
to_char(sysdate,'SS') * 1000);
end loop;
end loop;
end;
/

select chunk, count(*)
from
(select empno, ename,
ceil((rank() over (order by empno) +
count(1) over (partition by empno))/25) as chunk
from test)
group by chunk
order by chunk
;

因此,当 block 大小为 25 且组大小为 11 时,我们得到了适合 block 中 33 人的跳跃,尽管有 25 人的限制。大块大小和小组应该会使这种情况很少见,但您需要留出一些余地。因此,也许将 block 设置为 65,000,而不是一直设置为 65,536。

关于sql - (Oracle) 如何对行进行分组以进行分页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3438228/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com