【发布时间】:2020-11-26 10:00:54
【问题描述】:
我有一张表,每个月只有一天的值。我想将该值复制到整个月,直到出现新值。结果将是一个表格,其中包含基于最后一个已知值的每月每一天的数据。
有人可以帮我写这个查询吗?
【问题讨论】:
标签: sql sql-server gaps-and-islands
我有一张表,每个月只有一天的值。我想将该值复制到整个月,直到出现新值。结果将是一个表格,其中包含基于最后一个已知值的每月每一天的数据。
有人可以帮我写这个查询吗?
【问题讨论】:
标签: sql sql-server gaps-and-islands
由于缺乏可消耗的样本数据,这未经测试,但这看起来像是一个差距和孤岛问题。在这里你可以统计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;
【讨论】:
您似乎有本月第一天的数据。这表明了另一种方法:
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) 上的索引。它确实假设您想要的值是在该月的第一个日期。
【讨论】: