FIRST_VALUE没有按照我对PARTITION BY的期望而工作

时间:2018-03-15 15:53:28

标签: sql oracle window-functions

这是我的测试集:

master_ref  ref          value
56279276    56279325    FRAME ASSEMBLY1
56279276    384062724   FRAME ASSEMBLY2
56279276    443450775   FRAME ASSEMBLY3

我想根据给定master_ref的最高引用来检索值字段。

以下是我尝试过的所有内容:

select first_value(value) over (partition by ida3masterreference order by ida3a4 desc) value, ida3masterreference, ida3a4 from sts_epm_title1;

我希望只得到一个结果:

master_ref    ref         value
56279276    443450775   FRAME ASSEMBLY3

但它仍然会返回所有3个结果。我究竟做错了什么?谢谢!

2 个答案:

答案 0 :(得分:3)

first_value()是一个分析函数,因此它不会减少行数。您显然需要聚合函数,因此请使用keep语法:

select max(value) keep (dense_rank first order by ida3a4 desc) as value, 
       ida3masterreference, max(ida3a4) as ida3a4
from sts_epm_title1
group by ida3masterreference

答案 1 :(得分:0)

您可以使用ROW_NUMBER/RANK

WITH cte AS (
   select row_number() over (partition by ida3masterreference 
                             order by ida3a4 desc) AS rn, t.*
   from sts_epm_title1 t
)
SELECT *
FROM cte
WHERE rn = 1;