0
我希望能夠創建一個函數,它接受一個「標準化」查詢集,該查詢集具有整數id字段和時間戳作爲列,然後修改查詢集按每個30分鐘塊中的數量進行計數。下面的代碼適用於30分鐘的塊,如果你用真正的查詢替換Q並執行WITH(QUERY)Q.但是我希望能夠傳入任何適合該類型的查詢,然後返回新的SETOF range_durations_type。Postgres函數,需要一個時間間隔並返回一個結果集
CREATE TYPE range_durations_type AS (dtime TIMESTAMP, counts BIGINT);
CREATE TYPE object_datetime AS (id INTEGER, dtime TIMESTAMP);
CREATE OR REPLACE FUNCTION time_range_durations(Q range_durations_type, start_date TIMESTAMP, end_date TIMESTAMP)
RETURNS SETOF range_durations_type AS $$
BEGIN
RETURN QUERY WITH q_cleaned AS (
SELECT
Q.id,
Q.dtime,
Q.dtime - (
(extract(EPOCH FROM Q.dtime :: TIMESTAMP)) :: INTEGER -
extract(EPOCH FROM Q.dtime :: TIMESTAMP) :: INTEGER/1800 * 1800
) * INTERVAL '1 second' AS rounded_dtime
FROM Q
)
SELECT
series.dtime,
count(q_cleaned.id)
FROM (
SELECT
*
FROM
generate_series(start_date, end_date, '30 minutes') dtime) series
LEFT JOIN q_cleaned ON series.dtime = q_cleaned.rounded_dtime
GROUP BY 1
ORDER BY 1;
END;
$$ LANGUAGE plpgsql;
OT,但是......你知道Postgres有範圍類型,對嗎? http://www.postgresql.org/docs/current/static/rangetypes.html –
是的,我一直在經歷的類型,看看他們中的任何一個會工作。我對他們不夠熟悉......感謝提示。 – hazmat