Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle 查找每组其他行的最大值_Oracle_Analytic Functions - Fatal编程技术网

Oracle 查找每组其他行的最大值

Oracle 查找每组其他行的最大值,oracle,analytic-functions,Oracle,Analytic Functions,我有一个简单的表,在GRP\U ID组中有一个值ID 使用分析函数很容易找到每组的最大值 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

我有一个简单的表,在GRP\U ID组中有一个值ID

使用分析函数很容易找到每组的最大值

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=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

)

我希望窗口功能支持多种范围规范,例如:

max(id) over (
        partition by grp_id 
        order by id 
        range between unbounded preceding and 1 preceding
        or range between 1 following and unbounded following
        )
但不幸的是,他们没有

作为一种解决方法,您可以避免在不同的范围内两次使用该函数的子查询和CTE,并在该范围内调用coalesce

Coalesce是开箱即用的,因为ordering子句作为窗口函数调用的结果将是给定窗口中的max或null值

演示-


通过相关联查询获得预期结果!希望这有帮助。

完美的解决方案。我被困在这个问题上有一段时间了,我正要告诉OP,它不能在一个查询中完成。这就是它的美妙之处,所以,你总是能学到一些新的东西。正ID的解决方案很好。@MarmiteBomber-我认为,是的。@GurV,这个限制可以被取消吗?同时给出负数的解决方案?@MarmiteBomber-更新了答案。请查收
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
max(id) over (
        partition by grp_id 
        order by id 
        range between unbounded preceding and 1 preceding
        or range between 1 following and unbounded following
        )
select grp_id,
    id,
    coalesce(
            max(id) over (
                partition by grp_id
                order by id 
                range between 1 following and unbounded following
                )
            , max(id) over (
                partition by grp_id 
                order by id 
                range between unbounded preceding and 1 preceding
                )
            ) max_grp
from tst
order by 1,
    2
SELECT GRP_ID,ID, (SELECT Max(ID)  FROM TEST A WHERE A.ROWID<>B.ROWID AND A.GRP_ID=B.GRP_ID) maX_ID FROM TEST B;