2012-10-17 61 views
1

我希望我能解釋這一點。SQL Server - 基於值的順序合併時間序列數據,而不是時間戳

我有不同的基於時間的讀數爲不同的業務對象。每個閱讀都有一個時間戳和一個值。每個業務對象的數據的起始實際時間對於每個對象都不相同。 (即對象1的數據在6月首次記錄,對象2的數據在8月首次記錄)

我需要做的是聚合(總和,平均等)不同對象之間的值按照讀數的順序(第一個值,第二個值)而不考慮每個值的實際時間。

所有數據點代表每個月的一個值。所以業務對象之間沒有匹配的問題。每個業務對象的第二個值比第一個值晚一個月等。等等。值的時間戳具有該月的最後一天,但這對數據的性質沒有意義。年和月是重要的。

我一直在通過加載每個業務對象的整個數據集並通過合併數據的代碼來解決這個問題。但我想知道是否有辦法通過SOL來做到這一點。

有人有想法嗎?

下面是一些數據 這裏的數據是什麼樣子

object ID Date   Value 
1   2010-01-31  1.0 
1   2010-03-31  2.0 
1   2010-04-30  3.0 
2   2011-06-30  10.0 
2   2011-07-31  11.0 
2   2011-08-31  12.0 

期望的結果將是

month Sum  Average 
1  11.0  5.5 
2  11.0 11.0 (there is no second month for the first object) 
3  13.0  6.5 
4   3.0  3.0 (there is no fourth month for the second object) 
+2

原諒我的耳朵之間的具體情況,但我失去了你爲什麼*訂單*是重要的,如果你只是聚合他們?您可以發佈您擁有的數據的小例子,以及您最終希望在合併之後看到它的方式嗎?至少會幫助我。 :) –

+0

大衛,聚合是在一個月的基礎上。對象1的第一個月的數據值與對象2的第一個月的數據,第二個月的第二個月等相結合。 – user1753352

+0

已發佈新答案。希望這次我能正確理解。順便說一句,我認爲你在結果中有錯誤,第三行應該是:3 14.0 7.0 – Gidil

回答

0

使用新的樣本數據,這裏是一個解決方案:

;WITH PREPARED_DATA 
    AS (SELECT *, 
       Datediff(MONTH, Min(DATE) OVER (PARTITION BY ID), DATE) 
       + 1 MONTH 
     FROM DATA_TABLE) 
SELECT MONTH, 
     Sum(VALUE) AS SUM_VALUE, 
     Avg(VALUE) AS AVG_VALUE 
FROM PREPARED_DATA 
GROUP BY MONTH 

你可以找到一個工作示例here

+0

這是有效的,但是假定每個月的數據都是完整的。這意味着在任何系列中都會丟失幾個月。這假定每個對象的第二個返回行是第二個月,而第二個月的數據可能會丟失。這需要細化以處理每個對象數據開始的月份偏移量。我在這個答覆的空間不足,將用另一個樣本數據集和期望的結果發佈。 – user1753352

+1

將數據添加到原始問題,但格式有點偏離。希望人們可以閱讀它。 – user1753352

0
WITH M AS (
SELECT [Object ID] 
    , MIN([Date]) as [Date] 
    FROM TBL 
GROUP BY [Object ID] 
) 
SELECT DATEDIFF(MONTH,M.[Date], D.[Date]) + 1 AS [MONTH] 
    , SUM(VALUE) AS [SUM] 
    , AVG(VALUE) AS [AVERAGE] 
    FROM TBL D 
INNER JOIN M 
    ON D.[Object ID] = m.[Object ID] 
GROUP BY DATEDIFF(MONTH,M.[Date], D.[Date]) 

要麼通過查詢是錯誤的你的數學月3是錯誤的。

0

我的數學是關在MNY例如爲一個月3.這是我得到

select sum (value), dataorder + 1 
    from (select normaldata.value, 
      ((year(NormalData.DATE) - 1900) * 12) + MONTH(normaldata.date) - mintab.Mindate AS DataOrder from NormalData, (select ObjectId, 
Min(((year(date) - 1900)* 12) + MONTH(DATE)) as Mindate from 
NormalData group by ObjectID) as MINtab where (NormalData.ObjectID = 
mintab.ObjectID) 
    ) AS OrderedData group by DataOrder 

這部作品Access和SQL Server,而不是甲骨文。必須得到三件事。我會嘗試你的方法來看它是多麼兼容。

相關問題