您将需要一种方法来确定“第一”的含义。
在 Oracle 中,这是解决问题示例的一种方法:
create table test_tab(
id1 integer,
id2 integer,
id3 integer
);
insert into test_tab values(100,400,700);
insert into test_tab values(200,500,800);
insert into test_tab values(300,600,900);
commit;
select sum(decode(pos, 1, id1, null)) id1,
sum(decode(pos, 2, id2, null)) id2,
sum(decode(pos, 3, id3, null)) id3
from(
-- this subquery produces a rank column for the whole dataset
-- with an explicit order
select id1, id2, id3, rank() over (order by id1, id2, id3) pos from TEST_TAB
);
在此实现中,子查询用于建立行的排序,基于rank() 函数添加一个新的pos 列。
sum(decode(pos, 3, id3, null)) 构造是一种 Oracle 习惯用法,用于选择一个特定行(在本例中为第 3 行)而忽略其他行。
基本上,对于您的三行,decode 将导致 NULL 用于除具有指定数字的行之外的任何行,因此 id3 的表达式对于第三行将只有一个非空值,因此该组的总和将等于第 3 行中的 id3。
有很多方法可以做到这一点,这只是一种,您可能需要对此实现进行一些调整,以使其在您的实际代码中正常工作。