Как создать временной ряд из дат вступления в силу в SQL - PullRequest
0 голосов
/ 16 января 2020

Первая таблица с именем «Шаблон» имеет столбцы «Дата вступления в силу» и «Конфигурация», как показано ниже:

Вторая таблица представляет собой финансовый календарь, содержащий даты, финансовую неделю и Финансовый год.

Первая Дата вступления в силу приходится на 39-ю финансовую неделю, тогда как следующая дата вступления в силу приходится на 42-ю финансовую неделю. Это означает, что 40-я и 41-я финансовые недели должны иметь те же конфигурации, что и на 39-й фискальной неделе. Мне нужен выход, который отражает это. Я написал следующий фрагмент, но вывод неправильный и показывает конфигурацию D на 42-й финансовой неделе.

SELECT * 
FROM ( 
  SELECT a.FiscalYear, a.FiscalWeek, EffectiveDate, Configuration,
         ROW_NUMBER() OVER (PARTITION BY CONCAT(FiscalYear,FiscalWeek,EffectiveDate,Configuration) ORDER BY EffectiveDate ) AS rn 
  FROM [Template], 
       [FiscalCalendar] AS a 
  WHERE AND a.FiscalDate BETWEEN '2019-10-27' AND '2019-11-17' 
    AND EffectiveDate BETWEEN '2019-10-27' AND '2019-11-17' 
    AND EffectiveDate = a.FiscalDate 
) AS t WHERE t.rn = 1

1 Ответ

0 голосов
/ 16 января 2020

Использование квадратных скобок говорит о том, что база данных SQL Сервер, поэтому я предполагаю, что это так.

Для каждой строки в таблице календаря вам нужна самая последняя конфигурация. Это звучит как боковое соединение, то есть apply:

select cw.*, t.configuration
from (select c.fiscalweek, c.fiscalyear, min(c.fiscaldate) as weekstart
      from calendar c
      group by c.fiscalweek, c.fiscalyear
     ) cw cross apply
     (select top (1) with ties t.*
      from template t
      where t.effectivedate <= cs.weekstart
      order by t.effectivedate desc
     ) t;

Одна «хитрая» часть в том, что результаты представлены по неделям, а не по дням. Может быть более простой способ извлечь недели из таблицы Календаря, чем использовать агрегирование.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...