2016-01-22 14 views
0

我有什麼:幀計數

| id | timestamp | 
| ---| -----------| 
| 1 | 1453212172 | 
| 2 | 1453512172 | 
| 3 | 1453712172 | 
... 

我想通過時間框架分組條目的數量。從2015-11-01 20:00開始,我需要爲持續3天的團體計數:

| count | from  | to 
| ------| -----------|----------- 
| 34 | day 0, 8am | day 3, 8am 
| 10 | day 3, 8am | day 6, 8am 
| 56 | day 6, 8am | day 9, 8am 
... 

我發現只有整整一天。有沒有在數據庫層上做到這一點的好方法?我得到它的唯一方法是使用多個查詢並在應用程序層計算它,但它太昂貴了。

回答

1

因爲要存儲的數據的時間戳,當然你可以用一個簡單的計算做到這一點,在3天內爲:

24 x 60 * 60 = 86400 

與存儲過程中它得到的最小和最大的時間戳一起該數據集,將它們轉換爲整數,然後使用WHILE遍歷數據直到到達結束迭代,返回一個彙總行,因爲你需要:

CREATE OR REPLACE FUNCTION get_counts() RETURNS TABLE(row_count integer, from_time integer, to_time integer) 
AS $BODY$ 
    DECLARE 
    current_timestamp INTEGER; 
    maximum_timestamp INTEGER; 
    next_timestamp INTEGER; 
    BEGIN 
    current_timestamp := (SELECT CAST(EXTRACT(epoch FROM MIN(timestamp)) AS integer) FROM test); 
    maximum_timestamp := (SELECT CAST(EXTRACT(epoch FROM MAX(timestamp)) AS integer) FROM test); 

    WHILE current_timestamp < maximum_timestamp LOOP 
     next_timestamp := current_timestamp + 86400; 
     RETURN QUERY EXECUTE (SELECT COUNT(*) AS row_count, current_timestamp AS from_time, next_timestamp AS to_time FROM test WHERE CAST(EXTRACT(epoch FROM(timestamp)) AS integer) >= current_timestamp AND CAST(EXTRACT(epoch FROM(timestamp)) AS integer) < next_timestamp); 
     current_timestamp := next_timestamp; 
    END LOOP; 
    END 
$BODY$ LANGUAGE plpgsql; 

該程序是未經測試,可能不會制定出盒子,b ut讓你知道你能做什麼。然後,您可以從整數時間戳轉換回應用端的真實時間戳。

+1

我不'有任何工作查詢呢。但是,你所建議的只是一個時間範圍內行的選擇。我想讓他們按時間框架分組。 – messy

+0

自從我回答以來,您的問題發生了變化,我將更新我的回答 – toomanyredirects

+0

我沒有更改我的問題的含義,但它更加清晰。謝謝你的回答,但功能不是我想要的。我會在應用程序層上執行它。我希望用'正常'的查詢邏輯來解決問題。我感謝你的努力。尚未測試您的解決方案。 – messy