【问题标题】:SQL: Fill missing dates for each groupSQL:为每个组填写缺失的日期
【发布时间】:2020-01-31 14:13:21
【问题描述】:

我想在我的数据库中填写缺失的日期,但我有不同的组。新单元格应填写每个物料编号的最新日期值 这就是我的database 现在的样子:

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
                     ...

我通过以下方式创建了一个calendar 表:

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);

我试过了:

   select c.[Date]
    ,b.Materialnumber
    ,b.Amount
    from KSH_calendar as c
    left join database as b on c.[Date] = b.[MKPF_CPUDT] 

但这并没有让我得到预期的结果。甚至没有谈论获得最新价值。 有没有人有一些想法/链接让我更接近结果?

使用 Microsoft SQL Server 2017(版本 ID 14)

亲切的问候,

【问题讨论】:

  • 您使用的是哪个 dbms?
  • @jarlh 我使用的是 MS SQL Server 2017(版本 ID 14)

标签: sql sql-server date group-by calendar


【解决方案1】:

使用CROSS JOIN 生成行,然后引入值。在这种情况下,OUTER APPLY 可能是最简单的解决方案:

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;

如果您有很多日期,那么database(materialnumber, MKPF_CPUDT) 上的索引会有所帮助。但是还有一些更复杂的替代方法。如果性能有问题,我建议您再问一个问题。

【讨论】:

  • 其实你的想法对我帮助很大。我用材料编号创建了一个日历日期的交叉连接表。然后将数据库加入它。但是性能很糟糕......即使对于我的小数据集也是如此。不过,谢谢
  • @hergo.1。 . .可能正在填写缺失日期的数据。如果索引没有帮助,请再问一个问题。
猜你喜欢
  • 2018-02-12
  • 1970-01-01
  • 2018-07-15
  • 1970-01-01
  • 2018-06-24
  • 2018-10-05
  • 2019-06-26
相关资源
最近更新 更多