SQL: заполнить пропущенные даты для каждой группы - PullRequest
0 голосов
/ 02 октября 2019

Я хочу заполнить пропущенные даты в моей БД, но у меня есть разные группы. Новые ячейки должны быть заполнены значением самой последней даты для каждого номера материала. Вот как сейчас выглядит мой 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 (идентификатор версии 14)

С уважением,

1 Ответ

0 голосов
/ 02 октября 2019

Используйте 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). Но есть альтернативные методы, которые немного сложнее. Я бы порекомендовал вам задать еще один вопрос, если производительность является проблемой.

...