OVER函数和first_value

问题描述

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

所以,我写了这个查询

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

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

解决方法

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

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

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

,

您必须通过使用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

,

您显然要做关心哪个值。在Oracle中,您可以使用keep

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

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