我有一組簡單的表(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