【问题标题】:Oracle SQL Analytics Function FirstValue with 'NULL' Values具有“NULL”值的 Oracle SQL Analytics 函数 FirstValue
【发布时间】:2012-07-27 12:37:24
【问题描述】:

我对分析函数 FirstValue 有疑问:(语法:

FIRST_VALUE(TAble1.Column2 IGNORE NULLS) OVER (PARTITION BY Column1 ORDER BY Column3 DESC)

例子:

Column1     Column2              Column3 
1               A             01/01/2012
1               (NULL)        02/01/2012
1               (NULL)        03/01/2012

我想使用上述分析功能检索一行。

Column1     Column2              Column3 
1               A             01/01/2012

问题是 Oracle 检索到 2 行,一行为 Null,另一行为 column2 中的值“A”

你能帮我解决这个问题吗?

最好的问候

【问题讨论】:

  • 输入您的整个查询或相关代码。

标签: sql oracle analytic-functions


【解决方案1】:

这个问题有点老了,但发布答案以防其他人在谷歌上搜索并完全卡住。

这里应该归咎于 Oracle 的默认窗口行为。

地点

range between unbounded preceding and unbounded following

在您的 order by 子句之后

也就是说,

FIRST_VALUE(TAble1.Column2 IGNORE NULLS) OVER (PARTITION BY Column1 ORDER BY Column3 DESC range between unbounded preceding and unbounded following)

【讨论】:

    【解决方案2】:

    这是因为组中第一个非空值的位置在 column1 和 column2 上不同。

    first_value 函数与 distinct 的组合不是此类查询的解决方案。

    您可以改用 row_number 函数:

    select * from (
        select
          row_number() OVER (PARTITION BY Column1 ORDER BY Column3 DESC) as rnk,
          FIRST_VALUE(TAble1.Column1 IGNORE NULLS) 
              OVER (PARTITION BY Column1 ORDER BY Column3 DESC) as column1,
          FIRST_VALUE(TAble1.Column2 IGNORE NULLS) 
              OVER (PARTITION BY Column1 ORDER BY Column3 DESC) as column2,
        column3
        from your table
    )
    where rnk = 1
    

    【讨论】:

    • 我想使用函数 firstvalues
    • 编辑问题并输入您的全部选择。结果应该有 3 行,而不是 2 行。
    • 这一定是因为我的查询中有一个“不同”选项。我的选择是选择 DISTINCT TM_TRFATM.SEQGRP, FIRST_VALUE(RF_ADRPST.NUMIDVRIF IGNORE NULLS) OVER (PARTITION BY TM_TRFATM.SEQGRP ORDER BY RF_ADRPST.DATDERMDFADRPST DESC) NUMIDVRIF, FIRST_VALUE(RF_ADRPST.INDDMGALC IGNORE NULLS) OVER (PARTITION BY TM_TRFATM.SEQGRPDER RF_ADRPST.DATDERMDFADRPST DESC) INDDMGALC 来自 REFRIF.TM_TRFATM TM_TRFATM, REFRIF.RF_ADRPST RF_ADRPST where (RF_ADRPST.NUMIDVRIF=TM_TRFATM.NUMIDVRIF)
    • 抱歉,时间太短,无法理解与问题的关系。请根据问题中的示例调整查询。您可以编辑您的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-01
    相关资源
    最近更新 更多