sql-server - TSQL:计算离散时间序列的线性加权(移动)平均值
问题描述
我有一个离散的时间序列,如下所示:
product_id date sales_per_day
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
我想为此计算线性加权平均值,但我的数据不包含未发生销售的日期。
我已经通过加入日历表解决了这个问题,但我不喜欢这个解决方案。你知道解决这个问题的优雅方法吗?
提前致谢!
PS - 这是 LWMA 的公式:https ://en.wikipedia.org/wiki/Moving_average#Weighted_moving_average
解决方案
我对那个特定的计算并不太熟悉,但从我刚刚读到的内容来看,你应该能够使用“窗口框架”来计算“滚动信息需要将权重分配给过去的销售。没有看到你的实际公式申请,我不能确定天气是否会起作用。
以下只是我脑海中的一个例子......
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;
推荐阅读
- html - 如何在 HTML 样式中包含 CSS 样式(通过 ASP.Net MVC Razor 页面生成的代码)
- laravel - 无效的道具:道具“活动”的类型检查失败。预期的布尔值,得到值为“true”的字符串
- php - 从 json_url 获取数据以及如何插入到我的 mysql 数据库
- visual-studio-code - 如何避免在vs代码中显示前导和尾随空格
- php - PHP - MySql:如何在 db 中存储来自 [输入文本] 和 [下拉值] 的值
- java - 无法弄清楚为什么此测试在向 ArrayList 添加项目时失败
- java - 如何在 java 8 中使用 IntStream 返回一个升序数组列表?
- python - python pandas按值计数重新标记值
- angular - 如何在打字稿(Angular)中实现同步功能
- hasura - 类型 query_root 必须定义一个或多个字段