我需要一個函數向下舍時間戳的前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)
請** [編輯] **你的問題,並添加一些樣本數據和基於該數據的預期輸出。 [**格式化文本**](http://stackoverflow.com/help/formatting)請,[**沒有屏幕截圖**](http://meta.stackoverflow.com/questions/285551/why-may -i-不上傳圖像-的代碼上那麼當灰化-A-問題/ 285557#285557)。 ** [**]您的問題 - 請勿**在論壇中發佈代碼或其他信息。 –
generate_series的外連接我相信 –