【问题标题】:how to fill multiple nulls next to not null value in a column with LAG function? pls suggest如何在具有 LAG 函数的列中填充非空值旁边的多个空值?请建议
【发布时间】:2021-10-06 01:20:00
【问题描述】:

我想用以前的值填充 Date 列中的空值,即 12-01-2016,因为我可以给出明确的偏移值,但如果 1 有超过 2 个空值,那该怎么做呢?

select id,coalesce(date,lag(date,1)over(partition by id order by fromdt),
                    lag(date,2)over(partition by id order by fromdt)
from abc
              
              

当前数据

ID 日期 FROMDT TODT 1 12-01-2015 15-01-2015 20-01-2015 2 2016 年 12 月 1 日 2016 年 1 月 1 日 2016 年 2 月 20 日 3 空 21-02-2016 22-02-2016 4 空 23-02-2016 24-02-2016

预期数据

ID 日期 FROMDT TODT 1 12-01-2015 15-01-2015 20-01-2015 2 2016 年 12 月 1 日 2016 年 1 月 1 日 2016 年 2 月 20 日 3 2016 年 12 月 1 日 2016 年 2 月 21 日 2016 年 2 月 22 日 4 12-01-2016 23-02-2016 24-02-2016

【问题讨论】:

  • lag 值不会传播。您必须将数据加入或应用到自身,才能找到与值匹配的第一条记录。
  • 谢谢..我们有没有其他方法可以用案例或其他东西来完成它..

标签: sql sql-server function lag


【解决方案1】:

如果日期严格按升序排列,那么您可以使用MAX 窗口聚合

SELECT
  id,
  ISNULL([date], MAX([date]) OVER (ORDER BY FROMDT ROWS UNBOUNDED PRECEDING))
FROM abc;        

【讨论】:

    【解决方案2】:

    SQL Server 不支持窗口函数上的IGNORE NULLs 选项。一种选择是分配一个“分组”,然后将值分散到整个组中:

    select t.*, max(date) over (partition by grp) as imputed_date
    from (select t.*,
                 count(date) over (order by id) as grp
          from t
         ) t;
    

    【讨论】:

      猜你喜欢
      • 2021-09-05
      • 2021-12-31
      • 1970-01-01
      • 1970-01-01
      • 2021-07-04
      • 2021-07-15
      • 1970-01-01
      • 2015-07-22
      • 2015-09-17
      相关资源
      最近更新 更多