[英]Postgres function that takes in an interval and returns a result set
我希望能够创建一个函数,该函数采用具有整数id字段和时间戳记的“标准化”查询集作为列,然后修改查询集以按计数来汇总每个30分钟块中的数字。 如果您将Q替换为实际查询并执行WITH(QUERY)Q,则下面的代码可以工作30分钟。但是我希望能够传递适合该类型的任何查询,然后获取新的SETOF range_durations_type。
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;
我认为,完整的解决方案将不仅仅是一个简单的答案,但我建议您直接考虑几个重要方面。
范围类型。 在我看来,您正在寻找一组时间间隔。 这将使您可以执行以下操作:
CREATE OR REPLACE FUNCTION time_range_durations(bounds rsrange, inc interval)
这将允许您执行非常不同的操作,即范围和可用于增加范围的间隔。 因此,您可以任意增量查看两个时间戳内的内容。
然后,您可以将inc传递给generate_series函数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.