【问题标题】:Facing issue with populating last known value by replacing nulls using sql通过使用 sql 替换空值来填充最后一个已知值的问题
【发布时间】:2021-06-15 11:17:06
【问题描述】:

我的输入数据集如下。 我正在尝试用最后一个可用值填充空值。

输入数据集:

预期数据集:

我尝试过的查询:

SELECT *
,ISNULL(YEAR, (
        SELECT TOP 1 YEAR FROM SEQ_SET
        WHERE GROUPSEQ <= T.GROUPSEQ
        AND YEAR IS NOT NULL
        ORDER BY GROUPSEQ DESC)) AS YEAR_APPLY
,ISNULL(QUARTER, (
        SELECT TOP 1 QUARTER FROM SEQ_SET
        WHERE GROUPSEQ <= T.GROUPSEQ
        AND QUARTER IS NOT NULL
        ORDER BY GROUPSEQ DESC)) AS QUARTER_APPLY
FROM SEQ_SET T
ORDER BY COMPANY, YEAR, QUARTER

出了什么问题:

所有值都按预期出现,除了 groupseq 6 中的值。(以黄色突出显示的值)。 应该是 Q1 而不是 Q2。

即当有两个以上的空值时,逻辑不起作用

知道我的查询中缺少什么。

参考帖子:

How to get Previous Value for Null Values

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    基本上,您似乎想要lag(ignore nulls) -- 最近的非NULL 值。 SQL Server 不支持此标准函数。

    一种方法是通过计算每行的非 NULL 值的数量来分配组,然后使用窗口函数:

    select t.*,
           max(year) over (partition by company, grp) as year_apply,
           max(quarter) over (partition by company, grp) as quarter_apply
    from (select t.*,
                 count(year) over (partition by company order by groupseq) as grp
          from seq_set t
         ) t
    

    【讨论】:

    • 您好,这个解决方案非常有用,但是现在我们有一个更新的要求,即一年内,如果第一个值本身丢失,那么我们必须将下一个可用值应用于第一行/null值(并继续应用当前逻辑来填补缺失的中间空白)这将有助于确保一年内没有数据缺失的问题。有没有办法做到这一点
    • @kumarkeshav 。 . .我建议你问一个新问题。
    猜你喜欢
    • 2020-02-18
    • 2020-10-07
    • 2021-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-22
    • 2017-07-19
    • 2015-09-17
    相关资源
    最近更新 更多