SQL:为每个组填充缺少的日期
我想在数据库中填写缺失的日期,但我有不同的组。新单元格中应填写每个物料编号的最新日期值 这就是我的数据库现在的样子:SQL:为每个组填充缺少的日期,sql,sql-server,date,group-by,calendar,Sql,Sql Server,Date,Group By,Calendar,我想在数据库中填写缺失的日期,但我有不同的组。新单元格中应填写每个物料编号的最新日期值 这就是我的数据库现在的样子: Date [YYYY-MM-DD] Materialnumber Amount 2019-01-01 X 5 2019-01-15 X 7 2019-01-20 X
Date [YYYY-MM-DD] Materialnumber Amount
2019-01-01 X 5
2019-01-15 X 7
2019-01-20 X 2
2019-02-02 X 8
2019-01-03 Y 756
2019-01-18 Y 750
2019-02-22 Y 720
2019-03-05 Y 820
我希望它看起来像这样:
Date [YYYY-MM-DD] Materialnumber Amount
2019-01-01 X 5
2019-01-02 X 5
2019-01-03 X 5
2019-01-04 X 5
...
2019-01-15 X 7
2019-01-16 X 7
2019-01-17 X 7
...
2019-01-01 Y 756
2019-01-02 Y 756
2019-01-03 Y 756
...
2019-01-18 Y 750
2019-01-19 Y 750
...
我通过以下操作创建了一个日历表:
WITH CTE_DatesTable
AS
(
SELECT CAST('20190101' as date) AS [Date]
UNION ALL
SELECT DATEADD(dd, 1, [date])
FROM CTE_DatesTable
WHERE DATEADD(dd, 1, [date]) <= '20191231'
)
SELECT [date]
KSH_calendar
FROM CTE_DatesTable
OPTION (MAXRECURSION 0);
但这并没有让我达到预期的结果。甚至连最新的价值都不提。
是否有人有一些想法/链接让我更接近结果
使用Microsoft SQL Server 2017版本ID 14
表示善意的问候,使用交叉连接生成行,然后引入值。在这种情况下,外部应用可能是最简单的解决方案:
select c.[Date], m.Materialnumber, d.Amount
from KSH_calendar c cross join
(select distinct d.Materialnumber
from database d
) m outer apply
(select top (1) d.*
from database d
where d.Materialnumber = m.Materialnumber and
c.date <= d.MKPF_CPUDT
order by d.date desc
) d;
如果您有很多日期,那么数据库MaterialNumber上的索引MKPF_CPUDT将有所帮助。但也有一些更复杂的替代方法。如果性能是一个问题,我建议您再问一个问题。您使用的是哪种dbms?@jarlh我使用的是MS SQL Server 2017版本ID 14事实上,您的想法对我帮助很大。我用materialnumber创建了一个日历日期的交叉连接表。然后a将数据库连接到它。但是表演很糟糕。。。即使是我的小数据集。还thanks@hergo.1 . . . 可能正在填写缺失日期的数据。如果索引没有帮助,那么再问另一个问题。
select c.[Date], m.Materialnumber, d.Amount
from KSH_calendar c cross join
(select distinct d.Materialnumber
from database d
) m outer apply
(select top (1) d.*
from database d
where d.Materialnumber = m.Materialnumber and
c.date <= d.MKPF_CPUDT
order by d.date desc
) d;