我需要从表中生成一个报告,其结构和数据如下所示.
表票据的数据如下.
ID Assigned_To
100 raju
101 raju
102 raju
103 anil
104 anil
105 sam
106 raju
107 raju
108 anil
Run Code Online (Sandbox Code Playgroud)
Oracle SELECT应该生成以下报告
From_Id To_Id Assigned_To
100 102 raju
103 104 anil
105 105 sam
106 107 raju
108 108 anil
Run Code Online (Sandbox Code Playgroud)
有人可以帮我建立一个查询..?
先谢谢,马修.
SQL> create table ticket (id,assigned_to)
2 as
3 select 100, 'raju' from dual union all
4 select 101, 'raju' from dual union all
5 select 102, 'raju' from dual union all
6 select 103, 'anil' from dual union all
7 select 104, 'anil' from dual union all
8 select 105, 'sam' from dual union all
9 select 106, 'raju' from dual union all
10 select 107, 'raju' from dual union all
11 select 108, 'anil' from dual
12 /
Tabel is aangemaakt.
SQL> select min(id) from_id
2 , max(id) to_id
3 , assigned_to
4 from ( select id
5 , assigned_to
6 , id - row_number() over (partition by assigned_to order by id) grp
7 from ticket
8 )
9 group by assigned_to
10 , grp
11 order by from_id
12 /
FROM_ID TO_ID ASSIGNED_TO
---------- ---------- -----------
100 102 raju
103 104 anil
105 105 sam
106 107 raju
108 108 anil
5 rijen zijn geselecteerd.
Run Code Online (Sandbox Code Playgroud)
**更新与tuinstoel解决方案的性能比较结果:
在11.1.0.7:
SQL> exec runstats_pkg.rs_start
PL/SQL procedure successfully completed.
SQL> set termout off
SQL> select min(id) from_id
2 , max(id) to_id
3 , assigned_to
4 from ( select id
5 , assigned_to
6 , id - row_number() over (partition by assigned_to order by id) grp
7 from ticket
8 )
9 group by assigned_to
10 , grp
11 order by from_id
12 /
FROM_ID TO_ID ASSI
---------- ---------- ----
100 102 raju
103 104 anil
105 105 sam
106 107 raju
108 108 anil
109 111 raju
<snip>
589921 589922 raju
589923 589923 anil
327680 rows selected.
SQL> set termout on
SQL> exec runstats_pkg.rs_middle
PL/SQL procedure successfully completed.
SQL> set termout off
SQL> select * from table(testpl.pltest)
2 /
FROM_ID TO_ID ASSI
---------- ---------- ----
100 102 raju
103 104 anil
105 105 sam
106 107 raju
108 108 anil
109 111 raju
<snip>
589921 589922 raju
589923 589923 anil
327680 rows selected.
SQL> set termout on
Run Code Online (Sandbox Code Playgroud)
结果如下:
SQL> exec runstats_pkg.rs_stop(100)
Run1 draaide in 547 hsecs
Run2 draaide in 549 hsecs
Run1 draaide in 99.64% van de tijd
Naam Run1 Run2 Verschil
STAT.recursive cpu usage 2 106 104
LATCH.row cache objects 91 217 126
STAT.bytes received via SQL*Net from client 37,496 37,256 -240
STAT.recursive calls 7 5,914 5,907
STAT.table scan rows gotten 615,235 589,824 -25,411
STAT.sorts (rows) 917,504 589,824 -327,680
Run1 latches totaal versus run2 -- verschil en percentage
Run1 Run2 Verschil Pct
10,255 10,471 216 97.94%
PL/SQL procedure successfully completed.
Run Code Online (Sandbox Code Playgroud)
问候,Rob.
好吧,这不太漂亮,但是很有效。而且还没有其他人贡献过任何更漂亮的东西,所以也许这就是做到这一点的方法。
select min(from_id), to_id, assigned_to from
(
select from_id, max(to_id) as to_id, assigned_to from
(
select t1.id as from_id, t2.id as to_id, t1.assigned_to
from ticket t1
inner join ticket t2 on t1.assigned_to = t2.assigned_to and t2.id >= t1.id
where not exists
(
select * from ticket t3
where t3.ID > t1.ID
and t3.ID < t2.ID
and t3.assigned_to != t1.assigned_to
)
) x
group by from_id, assigned_to
) y
group by to_id, assigned_to
;
Run Code Online (Sandbox Code Playgroud)
我正在使用 mysql;很可能有一些 Oracle 的优点让这变得更好 - 因为很可能有一些更优雅的普通 sql。但至少这是一个开始。