Я не слишком знаком с этим конкретным расчетом, но из того, что я только что прочитал, вы должны быть в состоянии использовать «оконные рамы» для вычисления «скользящей информации, необходимой для назначения весов прошлым продажам».
Не видя фактическую формулу, которую вы применяете, я не могу сказать наверняка, будет ли она работать или нет.
Ниже приведен пример с моей головы ...
IF OBJECT_ID('tempdb..#TestData', 'U') IS NOT NULL
DROP TABLE #TestData;
CREATE TABLE #TestData (
product_id CHAR(5) NOT NULL,
[date] DATE NOT NULL,
sales_per_day DECIMAL(19,14) NOT NULL
);
INSERT #TestData (product_id, date, sales_per_day) VALUES
('VSG19', '2018-05-19', 1.00000000000000),
('VSG19', '2018-05-23', 1.00000000000000),
('VSG19', '2018-05-24', 2.00000000000000),
('VSG19', '2018-06-25', 1.00000000000000),
('VSG19', '2018-07-26', 1.00000000000000),
('VSG19', '2018-07-28', 1.00000000000000),
('VSG19', '2018-08-01', 1.00000000000000),
('VSG19', '2018-08-11', 1.00000000000000),
('VSG19', '2018-08-29', 1.00000000000000),
('VSG19', '2018-09-11', 1.00000000000000),
('VSG19', '2018-09-29', 1.00000000000000),
('VSG19', '2018-10-16', 1.00000000000000),
('VSG19', '2018-10-25', 1.00000000000000),
('VSG19', '2018-11-02', 1.00000000000000);
--===============================================================
SELECT
*,
days_since_last_sale = ISNULL(DATEDIFF(DAY, MAX(td.date) OVER (ORDER BY td.date ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING), td.date), 0),
days_from_first_sale = ISNULL(DATEDIFF(DAY, MIN(td.date) OVER (ORDER BY td.date), td.date), 0)
FROM
#TestData td;