2017-01-06 53 views
0

有條件所以,我有一個看起來像這樣Postgres的總金額就行比較

User_Object | filesize | created_date | deleted_date 
row 1  | 40  | May 10  | Aug 20 
row 2  | 10  | June 3  | Null 
row 3  | 20  | Nov 8  | Null 

我建立統計記錄用戶數據使用到基於圖形的基於時間的數據點的數據。但是,我很難開發一個查詢來獲取它之前所有查詢的每一行的總和,但僅限於該行創建時存在的行。採取這一步驟納入刪除的值之前,我有過這樣一個簡單樸素的查詢:

SELECT User_Object.id, User_Object.created, SUM(filesize) OVER (ORDER BY User_Object.created) AS sum_data_used 
    FROM User_Object 
    JOIN user ON User_Object.user_id = user.id 
    WHERE user.id = $1 

不過,我想這樣,有一個條件的窗函數以某種方式改變這種只得到任何總和在此用戶對象之前該行沒有刪除日期時創建的行。

這種不正確的語法說明了什麼我想做的事:

SELECT User_Object.id, User_Object.created, 
     SUM(CASE WHEN NOT window_function_row.deleted 
      OR window_function_row.deleted > User_Object.created 
      THEN filesize ELSE 0) 
     OVER (ORDER BY User_Object.created) AS sum_data_used 
    FROM User_Object 
    JOIN user ON User_Object.user_id = user.id 
    WHERE user.id = $1 

當這個功能對我有數據運行時,它應該輸出像

id  | created | sum_data_used| 
1  | May 10 | 40 
2  | June 3 | 50 
3  | Nov 8 | 30 

回答

1

東西沿着這些路線可能工作對你來說:

SELECT a.user_id 
     ,MIN(a.created_date) AS created_date 
     ,SUM(b.filesize) AS sum_data_used 
    FROM user_object a 
    JOIN user_object b ON (b.user_id <= a.user_id 
        AND COALESCE(b.deleted_date, a.created_date) >= a.created_date) 
    GROUP BY a.user_id 
    ORDER BY a.user_id 

對於每一行,自我加入,匹配id低於或等於,以及日期重疊。這將是昂貴的,因爲每行需要查看整個表來計算文件大小結果。這裏沒有累積的操作發生。但我不確定有沒有辦法。

示例表定義:

create table user_object(user_id int, filesize int, created_date date, deleted_date date); 

數據:

1;40;2016-05-10;2016-08-29 
2;10;2016-06-03;<NULL> 
3;20;2016-11-08;<NULL> 

結果:

1;2016-05-10;40 
2;2016-06-03;50 
3;2016-11-08;30 
+0

非常感謝您的建議!這是不幸的是,這將最終成爲一個昂貴的查詢,但是這就是爲什麼我希望通過此之前,我與子查詢什麼可怕的是比這N^2的複雜性有更糟糕的運行它 –