2017-06-06 83 views
1

我有如下所示按小時組的記錄的查詢:分組記錄了60分鐘持續時間,從所述第一記錄的時間戳開始小時

select date_trunc('hour', insert_time), 
     file_type, 
     avg(file_size) 
from my_table 
where insert_time > now()::timestamp - interval '7 days' 
group by 1, 2 order by 1, 2 

這組記錄爲一個小時的窗口每個小時窗口開始於0th分鐘。

這個需求的一點背景:我有一個自動測試,導致數據庫被填充。在測試開始之前,數據庫可能已經有一些記錄。我的自動化測試的目標是每小時執行一定數量的任務。我正在尋找一種方法來驗證我的測試的準確性,方法是在數據庫中爲每個小時生成一個報告,其中小時從匹配條件的第一條記錄的時間戳(分鐘)開始(我可以定義一個條件以匹配由我的自動化,所以它拿起自動化發送的第一個記錄)

因此,目標是按小時對記錄進行分組,但小時應使用匹配WHERE條件的第一條記錄的分鐘計算爲起點。

因此,如果插入由於我自動化的第一個記錄有時間戳2017-06-06 07:47:04.012734,然後分組應該發生這樣的:

1st group => 2017-06-06 07:47:04.012734 to 2017-06-06 08:47:04.012734 
2nd group => 2017-06-06 08:47:04.012734 to 2017-06-06 09:47:04.012734 
3rd group => 2017-06-06 09:47:04.012734 to 2017-06-06 10:47:04.012734 
. 
. 
. 

在此先感謝!

+0

你可以添加一個子查詢選擇你的條件的第一個測試時間,並從date_trunc函數得到它像'select date_trunc('hour',first_date).......... from my_table,(select min (insert_time)作爲first_date從.....)a where .... group by 1,2 .....' –

回答

0

一種方法是首先讀取第一條記錄的時間戳。然後從其他值中減去它,截斷到一個小時的精度並將其添加回來。

WITH 
CTE_MinTime 
AS 
(
    select 
     MIN(insert_time) AS MinTime 
    from my_table 
    where insert_time > now()::timestamp - interval '7 days' 
) 
select 
    CTE_MinTime.MinTime + date_trunc('hour', insert_time - CTE_MinTime.MinTime), 
    file_type, 
    avg(file_size) 
from 
    my_table 
    CROSS JOIN CTE_MinTime 
where insert_time > now()::timestamp - interval '7 days' 
group by 1, 2 
order by 1, 2 
; 

您可以將MinTime保存到某個變量中,而不是使用子查詢。