Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.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/7/sql-server/26.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
SQL:为每个组填充缺少的日期_Sql_Sql Server_Date_Group By_Calendar - Fatal编程技术网

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;