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 使用心得
oracle的row_number()over rank()over和dense_rank()over这三种分析函数(转)