Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
TSQL-SQL Server填充值与上一个填充日期的值_Sql_Sql Server_Tsql - Fatal编程技术网

TSQL-SQL Server填充值与上一个填充日期的值

TSQL-SQL Server填充值与上一个填充日期的值,sql,sql-server,tsql,Sql,Sql Server,Tsql,我试图在我的事实表中找出一件棘手的事情。 我的客户希望用上一个填充日期的值填充事实表中的每个空值 当我需要考虑的时候,它变得复杂了,它应该只更新值,如果维度的上下文是相同的 这是预期的结果: 我们使用的是Microsoft AnalysisServices,所以也许MDX和LastNoneEmpty也可以做到这一点,但现在需要为事实表提供一个有效的update语句。值为0的事实表是使用实际事实表交叉连接所有可能的日期组合生成的 谢谢你们 您可以使用apply执行此操作: 最大扫描获取具有非零值的

我试图在我的事实表中找出一件棘手的事情。 我的客户希望用上一个填充日期的值填充事实表中的每个空值

当我需要考虑的时候,它变得复杂了,它应该只更新值,如果维度的上下文是相同的

这是预期的结果:

我们使用的是Microsoft AnalysisServices,所以也许MDX和LastNoneEmpty也可以做到这一点,但现在需要为事实表提供一个有效的update语句。值为0的事实表是使用实际事实表交叉连接所有可能的日期组合生成的

谢谢你们

您可以使用apply执行此操作:

最大扫描获取具有非零值的最新dimdate。然后使用另一个max扫描将该值分散到所有值上

注意:这假定要应用的值始终大于零。代码很容易修改以处理此问题,但额外的case表达式只会使逻辑复杂化

其中任何一个都可以轻松地转换为更新。第二点特别容易:

with toupdate as (
      select t.*,
             max(value) over (partition by dim1, dim2, effectivedimdate) as new_value
      from (select t.*,
                   (case when value = 0
                         then max(case when value <> 0 then dimdate end) over (partition by dim1, dim2 order by dimdate)
                         else dimdate
                    end) as effective_dimdate
            from t
           ) t
     )
update toupdate
    set value = newvalue
    where value = 0;
select t.dim1, t.dim2, t.dimdate,
       max(value) over (partition by dim1, dim2, effectivedimdate) as value
from (select t.*,
             (case when value = 0
                   then max(case when value <> 0 then dimdate end) over (partition by dim1, dim2 order by dimdate)
                   else dimdate
              end) as effective_dimdate
      from t
     ) t;
with toupdate as (
      select t.*,
             max(value) over (partition by dim1, dim2, effectivedimdate) as new_value
      from (select t.*,
                   (case when value = 0
                         then max(case when value <> 0 then dimdate end) over (partition by dim1, dim2 order by dimdate)
                         else dimdate
                    end) as effective_dimdate
            from t
           ) t
     )
update toupdate
    set value = newvalue
    where value = 0;