获取由同一表中其他两个列值确定的列值的总和

时间:2019-01-28 19:21:40

标签: sql oracle

我有下表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)

问题:

上面的查询对于较小的表很有效,但是在较大的表时变慢。有没有获得这种输出的有效方法? (也许不使用子查询在同一表上使用两个联接?)

1 个答案:

答案 0 :(得分:1)

您可以通过使用子查询来避免自联接,该子查询基于idseq获得每一行的排名:

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)的那些行。

db<>fiddle demo