我有下表MY_TABLE
ID | SEQ | TYPE | VAL
1 | 2 | A | 100
1 | 3 | A | 100
1 | 2 | B | 200
1 | 3 | A | 100
1 | 3 | B | 200
2 | 25 | X | 100
2 | 24 | Y | 200
2 | 24 | X | 300
2 | 25 | Y | 400
2 | 25 | X | 50
在MY_TABLE
中,每个ID
都有一组Seq
值和Type
值。我想获取属于每个VAL
的{{1}}的每个TYPE
的{{1}}行的总和。
预期输出:
ID
我尝试过的事情:
max(Seq)
问题:
上面的查询对于较小的表很有效,但是在较大的表时变慢。有没有获得这种输出的有效方法? (也许不使用子查询在同一表上使用两个联接?)
答案 0 :(得分:1)
您可以通过使用子查询来避免自联接,该子查询基于id
和seq
获得每一行的排名:
select id, seq, type, sum(val)
from (
select id, seq, type, val, rank() over (partition by id order by seq desc) as rnk
from my_table
)
where rnk = 1
group by id, seq, type
order by id, seq, type;
ID SEQ T SUM(VAL)
---------- ---------- - ----------
1 3 A 200
1 3 B 200
2 25 X 150
2 25 Y 400
由于order by seq desc
,对于每个rnk
,最高的seq
的{{1}}值是1。然后,外部查询仅对id
进行过滤,将输出和汇总限制为排名最低(最高{rnk = 1
)的那些行。