选择另一列最大的列

我想这是一个标准问题。但是我找不到合适的解决方案。

我在表A中有三列:

ID     ID_Version     Var
1        1            A
1        2            A
1        3            X
1        4            D
2        1            B
2        2            Z
2        3            D
3        1            A
4        1            B
4        2            Q
4        3            Z

对于每个唯一的ID,我想隔离属于最大ID版本的Var值。

对于ID = 1,将为D;对于ID = 2,将为D;对于ID = 3,这将为A;对于ID = 4,这将为Z。

我尝试使用group by语句,但是在ID版本上使用max-函数并按ID分组时,我无法选择Var值。

有人知道如何为这个简单的问题编写快速,有效的代码吗?

zhzhhzhhh 回答:选择另一列最大的列

使用row_number()分析函数:

select ID,Var from
(
select row_number() over (partition by id order by id_version desc) as rn,t.*
  from tab t
)
where rn = 1

max(var) keep (dense_rank...)

select id,max(var) keep (dense_rank first order by id_version desc) as var
  from tab 
 group by id

Demo

,

您可以使用排名功能:

i
,

Oracle具有keep语法,因此您也可以使用聚合:

select id,max(id_version) as id_version,max(var) keep (dense_rank first order by id_version desc) as var
from a
group by id;
,

您还可以使用简单的联接来执行所需的操作,见下文:

SELECT A.id,A.var FROM A
JOIN
(SELECT id,MAX(id_version) as id_version
FROM A
GROUP BY id) temp ON (temp.id = A.id AND temp.id_version = A.id_version)

或者您也可以使用这样的子查询:

SELECT a1.id,a1.var FROM A a1
WHERE a1.id_version = (SELECT MAX(id_version) FROM A a2 WHERE a2.id = a1.id)
本文链接:https://www.f2er.com/3158439.html

大家都在问