select t1.a, t1.b, t1.c, t1.d, sum(decode(t1.rn, 1, t1.e, -t1.e)) ff
from (select t.a,
t.b,
t.c,
t.d,
t.e,
t.f,
rank() over(PARTITION by t.a, t.b, t.c, t.d order by t.f desc) rn
from ZZZ t) t1
where t1.rn <= 2
group by t1.a, t1.b, t1.c, t1.d;
--数据这样
1 1 1 1 10 2011
1 1 1 1 50 2012
1 1 1 1 100 2013
2 2 2 2 10 2011
2 2 2 2 50 2012
2 2 2 2 100 2013
--不单单只有2哈 还有更多
--出来的应该是这样的
1 1 1 1 50
2 2 2 2 50
/**注意:使用rank()over(order by 排序字段 顺序)排序的时候,空值是最大的
(如果排序字段为null,可能造成在排序时将null字段排在最前面,影响排序的正确性。
所以建议将dense_rank()over(order by 列名 排序)改为dense_rank()over(order by 列名 排序 nulls last)
这样只要排序字段为null,就会放在最后,而不会影响排序结果).**/
转载于:https://my.oschina.net/u/1763152/blog/272349