【问题标题】:OVER function and first_valueOVER 函数和 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 返回许多行。 解决办法是什么?

【问题讨论】:

  • 请在您的问题中添加示例数据和预期结果。

标签: sql oracle window-functions


【解决方案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;
      

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

      【讨论】:

        猜你喜欢
        • 2016-05-10
        • 2015-08-11
        • 1970-01-01
        • 1970-01-01
        • 2021-12-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多