【问题标题】:SQL Server: loop once a month value to the whole monthSQL Server:每月循环一次值到整个月
【发布时间】:2020-11-26 10:00:54
【问题描述】:

我有一张表,每个月只有一天的值。我想将该值复制到整个月,直到出现新值。结果将是一个表格,其中包含基于最后一个已知值的每月每一天的数据。

有人可以帮我写这个查询吗?

【问题讨论】:

    标签: sql sql-server gaps-and-islands


    【解决方案1】:

    由于缺乏可消耗的样本数据,这未经测试,但这看起来像是一个差距和孤岛问题。在这里你可以统计Yield的非NULL值的数量来分配组“数字”,然后在外部SELECT中得到窗口化的MAX

    WITH CTE AS(
        SELECT Yield,
               [Date],
               COUNT(yield) OVER (ORDER BY [Date]) AS Grp
        FROM dbo.YourTable)
    SELECT MAX(yield) OVER (PARTITION BY grp) AS yield
           [Date],
           DATENAME(WEEKDAY,[Date]) AS [Day]
    FROM CTE;
    

    【讨论】:

      【解决方案2】:

      您似乎有本月第一天的数据。这表明了另一种方法:

      select t.*, t2.yield as imputed_yield
      from t cross apply
           (select t2.*
            from t t2
            where t2.date = datefromparts(year(t.date), month(t.date), 1)
           ) t2;
      

      这应该能够利用(date, yield) 上的索引。它确实假设您想要的值是在该月的第一个日期。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-06-03
        • 2011-10-24
        • 2019-10-12
        • 1970-01-01
        • 1970-01-01
        • 2019-04-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多