我有一组简单的表(ID
)(GRP_ID
)。找到每组其他行的最大值
create table tst as
select 1 grp_id, 1 id from dual union all
select 1 grp_id, 1 id from dual union all
select 1 grp_id, 2 id from dual union all
select 2 grp_id, 1 id from dual union all
select 2 grp_id, 2 id from dual union all
select 2 grp_id, 2 id from dual union all
select 3 grp_id, 3 id from dual;
它是简单的找到每使用分析功能组的最大值。
select grp_id, id,
max(id) over (partition by grp_id) max_grp
from tst
order by 1,2;
GRP_ID ID MAX_GRP
---------- ---------- ----------
1 1 2
1 1 2
1 2 2
2 1 2
2 2 2
2 2 2
3 3 3
但目标是找到排除当前行的值的最大值。
这是预期的结果(柱MAX_OTHER_ID
):
GRP_ID ID MAX_GRP MAX_OTHER_ID
---------- ---------- ---------- ------------
1 1 2 2
1 1 2 2
1 2 2 1
2 1 2 2
2 2 2 2
2 2 2 2
3 3 3
注意,在GRP_ID = 2上的MAX值存在平局,所以MAX_OTHER_ID保持相同。
我确实管理了这个两步骤的解决方案,但我想知道是否有更直接简单的解决方案。
with max1 as (
select grp_id, id,
row_number() over (partition by grp_id order by id desc) rn
from tst
)
select GRP_ID, ID,
case when rn = 1 /* MAX row per group */ then
max(decode(rn,1,to_number(null),id)) over (partition by grp_id)
else
max(id) over (partition by grp_id)
end as max_other_id
from max1
order by 1,2
;
完美的解决方案。我被困了一段时间,并且正准备告诉OP它不能在单个查询中完成。这就是你的美丽,你总是会学到新的东西。 – Utsav
积极的'ID'的好方案。 –
@MarmiteBomber - 我认为,是的。 – GurV