2017-06-02 42 views
0

我有一個包含時間戳數據的表。我試圖構造一個查詢,每隔5分鐘會返回一行,如果時間戳落在該間隔中,則列爲TRUE,如果沒有,則爲FALSE,從數據中最早的時間戳開始,直到最新的。PostgreSQL - 查詢顯示哪些時間間隔包含數據

我可以得到包含時間戳像這樣的5分鐘間隔:

SELECT DISTINCT DATE_TRUNC('hour', t) + (EXTRACT(minute FROM t)::int/5 * interval '5 min') AS t, 
     TRUE AS val 
FROM data_table 
ORDER BY t; 

但我怎麼能然後用不包含數據的時間間隔填寫這些信息?

+0

請** [編輯] **你的問題,並添加一些樣本數據和基於該數據的預期輸出。 [**格式化文本**](http://stackoverflow.com/help/formatting)請,[**沒有屏幕截圖**](http://meta.stackoverflow.com/questions/285551/why-may -i-不上傳圖像-的代碼上那麼當灰化-A-問題/ 285557#285557)。 ** [**]您的問題 - 請勿**在論壇中發佈代碼或其他信息。 –

+2

generate_series的外連接我相信 –

回答

1

我需要一個函數向下舍時間戳的前5分鐘爲界:

CREATE OR REPLACE FUNCTION trunc_five_min(timestamp with time zone) 
    RETURNS timestamp with time zone 
    LANGUAGE sql STABLE AS 
$$SELECT date_trunc('hour', $1) 
     + date_trunc(
       'minute', 
       ($1 - date_trunc('hour', $1))/5 
      ) * 5$$; 

此功能將得到聯到查詢,所以你可以看到它作爲一個符號上的快捷方式。

當我有時間序列表是這樣的:

TABLE samples ORDER BY ts; 

┌────────────────────────┐ 
│   ts   │ 
├────────────────────────┤ 
│ 2017-06-02 11:58:30+02 │ 
│ 2017-06-02 12:00:00+02 │ 
│ 2017-06-02 12:03:00+02 │ 
│ 2017-06-02 12:17:00+02 │ 
│ 2017-06-02 12:17:22+02 │ 
└────────────────────────┘ 
(5 rows) 

我可以產生與此查詢所期望的結果:

WITH lim AS (SELECT trunc_five_min(min(ts)) AS min, 
        trunc_five_min(max(ts)) AS max 
      FROM samples) 
SELECT i.i AS interval_start, 
     count(s.ts) AS num_samples 
FROM lim 
    CROSS JOIN LATERAL generate_series(lim.min, lim.max, INTERVAL '5 minutes') i 
    LEFT JOIN samples s 
     ON s.ts >= i AND s.ts < i + INTERVAL '5 minutes' 
GROUP BY i.i ORDER BY i.i; 

┌────────────────────────┬─────────────┐ 
│  interval_start  │ num_samples │ 
├────────────────────────┼─────────────┤ 
│ 2017-06-02 11:55:00+02 │   1 │ 
│ 2017-06-02 12:00:00+02 │   2 │ 
│ 2017-06-02 12:05:00+02 │   0 │ 
│ 2017-06-02 12:10:00+02 │   0 │ 
│ 2017-06-02 12:15:00+02 │   2 │ 
└────────────────────────┴─────────────┘ 
(5 rows) 
+0

謝謝,'generate_series'是我失蹤的作品。不知何故,大約40分鐘的谷歌搜索沒有打開它,雖然當然現在我知道谷歌是什麼容易找到它。 – Tom

+0

還要注意,問題包括如何截斷時間戳爲5分鐘的分辨率。 – Tom