我正在尝试在24小时内有效地(使用SQL Server 2008)计算ProductCount的moving average。对于Product表中的每一行,我想知道过去24小时内ProductCount(针对给定产品)的平均值。我们的数据存在的一个问题是并非所有日期/小时都存在(参见下面的示例)。如果缺少TimeStamp,则表示ProductCount为0。
我有一张包含数百万或行的表,其中包含日期,产品和计数。下面是我必须处理的数据的简化示例。
关于如何实现这一点的任何想法?
编辑:我需要的另一个数据是该期间的MIN和MAX ProductCount(即24h)。由于缺少值,计算MIN / MAX有点棘手......
+---------------------+-------------+--------------+
| Date | ProductName | ProductCount |
+---------------------+-------------+--------------+
| 2012-01-01 00:00:00 | Banana | 15000 |
| 2012-01-01 01:00:00 | Banana | 16000 |
| 2012-01-01 02:00:00 | Banana | 17000 |
| 2012-01-01 05:00:00 | Banana | 12000 |
| 2012-01-01 00:00:00 | Apple | 5000 |
| 2012-01-01 05:00:00 | Apple | 6000 |
+---------------------+-------------+--------------+
SQL
CREATE TABLE ProductInventory (
[Date] DATETIME,
[ProductName] NVARCHAR(50),
[ProductCount] INT
)
INSERT INTO ProductInventory VALUES ('2012-01-01 00:00:00', 'Banana', 15000)
INSERT INTO ProductInventory VALUES ('2012-01-01 01:00:00', 'Banana', 16000)
INSERT INTO ProductInventory VALUES ('2012-01-01 02:00:00', 'Banana', 17000)
INSERT INTO ProductInventory VALUES ('2012-01-01 05:00:00', 'Banana', 12000)
INSERT INTO ProductInventory VALUES ('2012-01-01 00:00:00', 'Apple', 5000)
INSERT INTO ProductInventory VALUES ('2012-01-01 05:00:00', 'Apple', 6000)
答案 0 :(得分:4)
嗯,你需要计算每小时的平均值这一事实实际上使这更简单,因为你需要SUM
产品数量除以固定数量(24)。所以我认为这将得到你想要的结果(虽然在这种特殊情况下,光标实际上更快):
SELECT A.*, B.ProductCount/24 DailyMovingAverage
FROM ProductInventory A
OUTER APPLY ( SELECT SUM(ProductCount) ProductCount
FROM ProductInventory
WHERE ProductName = A.ProductName
AND [Date] BETWEEN DATEADD(HOUR,-23,A.[Date]) AND A.[Date]) B
答案 1 :(得分:3)
我在Lamak的答案中加入了min / max:
SELECT *
FROM ProductInventory A
OUTER APPLY (
SELECT
SUM(ProductCount) / 24 AS DailyMovingAverage,
MAX(ProductCount) AS MaxProductCount,
CASE COUNT(*) WHEN 24 THEN MIN(ProductCount) ELSE 0 END AS MinProductCount
FROM ProductInventory
WHERE ProductName = A.ProductName
AND [Date] BETWEEN DATEADD(HOUR, -23, A.[Date]) AND A.[Date]) B
要考虑丢失的记录,请在使用MIN(ProductCount)
之前检查过去24小时内确实有24条记录,否则返回0.
工作SQL Fiddle,添加一堆橘子(蒲式耳?)以显示MinProductCount工作