在我找到带有 max 的正确行后获取行的列值

  • 本文关键字:获取 max sql oracle
  • 更新时间 :
  • 英文 :


表格:表

我的目标是在amt列中具有最高绝对值的行中找到代码值,同时联合排序我只在具有相同id和id_addl对的行之间搜索最大绝对值。

例如,前3行有匹配的id+id_addl组合,所以我找到了最高的绝对值(本例为43562)。现在,我需要找到该行的代码,即CLP。

这是我所拥有的:

with max_code as(
select
s.id,
s.id_addl,
s.amt,
s.code
from
schema.viw s
)
select
b.code,
b.amt,
b.id,
b.id_addl,
b.max_amt,
m.code
from
(
select
a.code,
a.amt,
a.id,
a.id_addl,
max(abs(a.amt))over(partition by a.id, a.id_addl) max_amt
from
schema.viw a
) b,
max_code m
where
b.id = m.id and
b.id_addl = m.id_addl and
b.max_amt = m.amt;

知道我该怎么改进吗?

使用MAX(...) KEEP (...) OVER (...):

SELECT code,
amt,
id,
id_addl,
MAX(ABS(amt))
OVER (PARTITION BY id, id_addl) AS max_amt,
MAX(code)
KEEP (DENSE_RANK LAST ORDER BY ABS(amt))
OVER (PARTITION BY id, id_addl)
AS max_code
FROM  schema.viw;

对于样本数据:

CREATE TABLE schema.viw (id, id_addl, amt, code) AS
SELECT 1, 4132, 23432, 'USD' FROM DUAL UNION ALL
SELECT 1, 4132, 12354, 'EUR' FROM DUAL UNION ALL
SELECT 1, 4132, 43562, 'CLP' FROM DUAL UNION ALL
SELECT 2, 3124, 84563, 'EUR' FROM DUAL;

输出:

CODEAMT
USD23432EUR12354

最新更新