2017-09-01 189 views
3

考慮這個數據集:如何計算運行總計是值的總和鮮明

id  site_id type_id value date 
------- ------- ------- ------- ------------------- 
1  1  1  50  2017-08-09 06:49:47 
2  1  2  48  2017-08-10 08:19:49 
3  1  1  52  2017-08-11 06:15:00 
4  1  1  45  2017-08-12 10:39:47 
5  1  2  40  2017-08-14 10:33:00 
6  2  1  30  2017-08-09 07:25:32 
7  2  2  32  2017-08-12 04:11:05 
8  3  1  80  2017-08-09 19:55:12 
9  3  2  75  2017-08-13 02:54:47 
10  2  1  25  2017-08-15 10:00:05 

我想構建一個返回由類型每個日期的運行總計查詢。我可以關閉一個窗口函數,但我只希望爲每個站點計算總運行總數的最新值(一個簡單的窗口函數將不起作用,因爲它總計所有值直到一個日期 - 而不僅僅是每個站點的最後值)。所以我想它可以更好地描述爲一個獨特的總數?

我要找的會是這樣的結果:

type_id date    sum 
------- ------------------- ------- 
1  2017-08-09 06:49:47 50 
1  2017-08-09 07:25:32 80 
1  2017-08-09 19:55:12 160 
1  2017-08-11 06:15:00 162 
1  2017-08-12 10:39:47 155 
1  2017-08-15 10:00:05 150 
2  2017-08-10 08:19:49 48 
2  2017-08-12 04:11:05 80 
2  2017-08-13 02:54:47 155 
2  2017-08-14 10:33:00 147 

這裏的關鍵是,和不運行總和。它應該只是每個網站的最新值的總和,按類型,在每個日期。我想我可以通過瀏覽上面提供的結果集來解釋它。對於我的解釋,我會按照時間順序瀏覽原始數據,並嘗試解釋預期結果。

結果的第一行開始我們在2017-08-09 06:49:47,按時間順序,只有一個類型1的記錄,它是50,所以這是我們的總和爲2017年 - 08-09 06:49:47。

結果的第二行是在2017年8月9日7時25分32秒,在這個時間點上,我們有2個與TYPE_ID值唯一站點= 1。他們有50和30個值,所以總和爲80.

結果的第三行發生在2017-08-09 19:55:12,現在我們有3個網站的值爲type_id = 1。50 + 30 + 80 = 160.

第四行是它變得有趣的地方。在2017-08-11 06:15:00有4條記錄type_id = 1,但其中2個是針對同一個網站的。我只是在最近的值感興趣的每個網站,所以我想總結的值是:30 + 80 + 52 導致在。

第5行與第4行相似,因爲site_id:1,type_id:1的值再次發生了變化,現在爲45.這會導致type_id的最新值:1在2017-08-12 10:39 :47現在:30 + 80 + 45 = 155.

當我們考慮在2017-08-15 10:00:05,站點2對type_id 1有一個新值時,審查第6行也很有趣,這使我們:80 + 45 + 25 = 爲 2017年8月15日十時00分05秒。

+0

你需要TYPE_ID分區相信 –

+0

是這樣的:選擇TYPE_ID ,日期 ,SUM(值)超過(通過日期TYPE_ID順序分區) 從表 爲了通過TYPE_ID,日期 –

+0

我可以理解你的前三個總和值(50,80,160)的值來自哪裏,但不知道第四排爲什麼/如何是162? – SEarle1986

回答

0

您可以通過在窗框的ORDER BY條款獲得累計(運行總和)。

select 
    type_id, 
    date, 
    sum(value) over (partition by type_id order by date) as sum 
from your_table; 

ORDER BY作品,因爲

默認框架的選項是RANGE UNBOUNDED PRECEDING,這是一樣的RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW

+0

謝謝@ Andy-Carlson,但是一筆花費並不是我所追求的。我只想要每個網站的最新值的總和,按type_id分組。我會盡量讓我的問題更清楚。 – jasonhillPDX

0
SELECT  type_id, 
      date, 
      SUM(value) OVER (PARTITION BY type_id ORDER BY type_id, date) - (SUM(value) OVER (PARTITION BY type_id, site_id ORDER BY type_id, date) - value) AS sum 
FROM  your_table 
ORDER BY type_id, 
      date 
+0

這真的很聰明!如果我們只有一個網站具有多個類型的數字,則效果很好。我在我的數據集中添加了另一行(2017-08-15 10:00:05),這會導致網站2的類型1值發生更改。這會導致您的建議有點麻煩,因爲它只處理當前網站逐行依據。你有解決這個問題的想法嗎? – jasonhillPDX