OVER 函数和 first_value

Posted

技术标签:

【中文标题】OVER 函数和 first_value【英文标题】:OVER function and first_value 【发布时间】:2020-08-21 09:34:26 【问题描述】:

我有一个名为 ARTICLE 的表,其中包含许多列,特别是 MFC 和 ANA。对于每个 MFC,我想要第一个不为空的 ANA。

所以,我写了这个查询:

select mfc, first_value(ana) over(partition by mfc) as FirstAna
from article
where ana is not null

但它会为每个 MFC 返回许多行。 解决办法是什么?

【问题讨论】:

请在您的问题中添加示例数据和预期结果。 【参考方案1】:

您似乎不在乎 返回哪个 值(没有 ORDER BY 子句),为什么不呢

select mfc,
       max(ana)
from article
where ana is not null
group by mfc

【讨论】:

如果有帮助我很高兴。 @coutiereric 。 . .您的问题明确指出:“第一个不为空的 ANA。”听起来你确实关心你想要的价值。因此,Littlefoot 的回答(表示您不在乎)和接受(这表明它是正确的)都让我感到困惑。如果这确实是正确答案,请修正问题,使其清楚地匹配答案。【参考方案2】:

First_value 仍将为每一行返回值,但该值将是该分区的第一个值。如果要将其限制为每组一个值,则必须按功能使用分组。

【讨论】:

【参考方案3】:

您必须使用ORDER BY 子句定义第一个含义并使用关键字DISTINCT,这样您就不会多次获得每个mfc 的同一行:

select distinct
       mfc, 
       first_value(ana) over (partition by mfc order by somecolumn) as FirstAna
from article 
where ana is not null

somecolumn 更改为定义顺序的列名。

【讨论】:

【参考方案4】:

您显然确实关心哪个值。在 Oracle 中你可以使用keep:

select mfc, 
       max(ana) keep (dense_rank first order by ???) as FirstAna
from article
where ana is not null
group by mfc;

??? 用于指定“第一”排序的列。

【讨论】:

以上是关于OVER 函数和 first_value的主要内容,如果未能解决你的问题,请参考以下文章

mysql窗口函数rank() over、dense_rank() over、row_number() over 使用心得

OVER 函数和 first_value

oracle的row_number()over rank()over和dense_rank()over这三种分析函数(转)

sqlserver:rank() over()函数

oracle累积求和分析函数sum over的使用

如何在 over 函数中使用 partition by 和 order by?