1

24 時間にわたる ProductCountの移動平均を(SQL Server 2008 を使用して) 効率的に計算しようとしています。Product テーブルのすべての行について、過去 24 時間の (その特定の製品の) ProductCount の平均を知りたいです。データの問題の 1 つは、すべての日付/時間が存在するわけではないことです (以下の例を参照)。TimeStamp がない場合は、ProductCount が 0 だったことを意味します。

日付、製品、およびカウントを含む数百万または行のテーブルがあります。以下は、私が扱わなければならないデータの簡単な例です。

それを達成する方法について何か考えはありますか?

編集: 私が必要とするもう 1 つのデータは、期間 (つまり 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

1 時間ごとの平均を計算する必要があるという事実は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を返します。

MinProductCountが機能していることを示すためにオレンジの束(ブッシェル?)が追加されたSQLフィドルの機能

于 2012-05-24T02:32:06.567 に答える