我正在使用PostgreSQL,目前正在创建一个存储过程来做一些计算。我已经搜索了一上午并阅读了文档,但要么我想要的功能不受支持,要么我一定忽略了一些东西。基本上,这是我所拥有的:
CREATE OR REPLACE FUNCTION predict_usage(preWaitTimes text, afterEndTimes text, targetIds text, drivingTime numeric, arrivalTime timestamp with time zone)
RETURNS TABLE(
target_id text,
pre_wait_time numeric,
after_end_time numeric,
driving_time numeric,
starting_time timestamp with time zone,
ending_time timestamp with time zone
)
DECLARE
target_ids uuid[] := string_to_array(targetIds, ',')::uuid;
pre_wait_times integer[] := string_to_array(preWaitTimes, ',')::integer[];
after_end_times integer[] := string_to_array(afterEndTimes, ',')::integer[];
BEGIN
SELECT *
FROM generate_series(1, ceil(target.quantity/target.size)) as series,
END;
基本上,我会计算需要多长时间出差一次才能交付某件东西,我使用generate_series
来计算。这在一个SQL查询中就可以实现,我可以使用它来计算需要多少个驱动器才能交付所有东西,每个驱动器都有自己的开始时间和结束时间。
现在,由于不同的targets
有不同的准备和结束时间(preWaitTimes
和afterEndTimes
),我需要以某种方式将当前使用的target_id
的索引与这些额外时间的数组连接起来,以便进行计算。
我已经尝试了一个FOR
循环,但是没有成功运行它。我怀疑数据库是否能很好地优化FOR循环,我可以在Java后端解决它。目标是在数据库中进行,主要是为了速度。
编辑:
经过思考,也许加入3个数组到一个表开始 *,然后 * 我的计算可以工作吗?
1条答案
按热度按时间pcrecxhr1#
经过更多的文档和搜索,我找到了使用
UNNEST
的解决方案:*收件人:
创建的表有一些限制。例如,如果
id
是一个uuid[]
,它使用的id与您要联接的表中的PK
相同,它将以某种方式 * 不 * 执行散列联接。这可以通过以下语句来避免: