1

我正在尝试有效地计算(使用 SQL Server 2008)ProductCount 在 24 小时内的移动平均值。对于 Product 表中的每一行,我想知道过去 24 小时内 ProductCount 的平均值(对于给定的产品)是多少。我们数据的一个问题是并非所有日期/时间都存在(参见下面的示例)。如果缺少 TimeStamp,则意味着 ProductCount 为 0。

我有一个包含数百万行的表,其中包含日期、产品和计数。下面是我必须处理的数据的简化示例。

关于如何实现的任何想法?

编辑:我需要的另一条数据是该期间(即 24 小时)的 MIN 和 MAX ProductCount。由于缺少值,计算 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)
4

2 回答 2

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
于 2012-05-22T16:41:55.067 回答
3

我在 Lamak 的回答中添加了最小值/最大值:

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

要考虑丢失的记录,请检查在使用前的最后 24 小时内确实有 24 条记录,MIN(ProductCount)否则返回 0。

工作SQL Fiddle,添加了一堆(蒲式耳?)橘子以显示 MinProductCount 工作

于 2012-05-24T02:32:06.567 回答