Postgresql 对于pg函数内的循环

Postgresql 对于pg函数内的循环,postgresql,for-loop,plpgsql,Postgresql,For Loop,Plpgsql,我有下面的pg脚本 create or replace function ended_jobs() returns table( "Time Range" timestamptz, "Ended Jobs" numeric ) as $$ begin return query SELECT date_trunc('HOUR',date_interval) as "Time Range", sum(COALESCE(end_count,0)) "Ended Jobs" FROM "job_

我有下面的pg脚本

create or replace function ended_jobs()
returns table(
 "Time Range" timestamptz,
 "Ended Jobs" numeric
) as $$
begin
return query SELECT date_trunc('HOUR',date_interval) as "Time Range", sum(COALESCE(end_count,0)) "Ended Jobs"  
FROM "job_start_end_rollups"  
right join ( (select   current_timestamp - interval '0 HOUR' date_interval)  
union all (select   current_timestamp - interval '1 HOUR' date_interval) 
union all (select   current_timestamp - interval '2 HOUR' date_interval) 
union all (select   current_timestamp - interval '3 HOUR' date_interval) 
union all (select   current_timestamp - interval '4 HOUR' date_interval) 
union all (select   current_timestamp - interval '5 HOUR' date_interval) 
union all (select   current_timestamp - interval '6 HOUR' date_interval) 
union all (select   current_timestamp - interval '7 HOUR' date_interval) 
union all (select   current_timestamp - interval '8 HOUR' date_interval) 
union all (select   current_timestamp - interval '9 HOUR' date_interval) 
union all (select   current_timestamp - interval '10 HOUR' date_interval) 
union all (select   current_timestamp - interval '11 HOUR' date_interval) 
union all (select   current_timestamp - interval '12 HOUR' date_interval) 
union all (select   current_timestamp - interval '13 HOUR' date_interval) 
union all (select   current_timestamp - interval '14 HOUR' date_interval) 
union all (select   current_timestamp - interval '15 HOUR' date_interval) )  
date_intervals on date_trunc('HOUR', TIMESTAMP WITH TIME ZONE 'epoch' + chunk_start_time * interval '1 millisecond' ) = date_trunc('HOUR',date_interval)   
GROUP BY date_part('HOUR',TIMESTAMP WITH TIME ZONE 'epoch' + chunk_start_time * interval '1 millisecond'),date_interval  
ORDER BY date_interval LIMIT 16;
end;
$$
LANGUAGE 'plpgsql';
在运行上述pg脚本之后,我可以获得数据

select * from ended_jobs()
如何在正确的联接中写入'for loop'以避免多个'union all',如下所示

.......
right join ( (select   current_timestamp - interval '0 HOUR' date_interval)
for i in 1..16 loop
union all (select   current_timestamp - concat(i,' HOUR')::INTERVAL date_interval) 
end loop;
........

您可以使用
generate_series()
进行以下操作:

FROM "job_start_end_rollups"  
  right join generate_series(current_timestamp - interval '15 HOUR',
                             current_timestamp, 
                             interval '1 hour') as date_intervals(date_interval) 
             ON .... 
您还可以将日期移动到以下位置:

right join (
  select date_trunc('HOUR',di) as date_interval
  from generate_series(current_timestamp - interval '15 HOUR',
                       current_timestamp, 
                       interval '1 hour') as t(di)
) as date_intervals ON .... = date_intervals.date_interval

您可以使用
generate_series()
进行以下操作:

FROM "job_start_end_rollups"  
  right join generate_series(current_timestamp - interval '15 HOUR',
                             current_timestamp, 
                             interval '1 hour') as date_intervals(date_interval) 
             ON .... 
您还可以将日期移动到以下位置:

right join (
  select date_trunc('HOUR',di) as date_interval
  from generate_series(current_timestamp - interval '15 HOUR',
                       current_timestamp, 
                       interval '1 hour') as t(di)
) as date_intervals ON .... = date_intervals.date_interval

不相关,但是:您不需要
plpgsql
。简单一点就够了。另外:语言名称是一个标识符,不要将其放在单引号中:它应该是
language plpgsql
Unrelated,但是:您不需要
plpgsql
。简单一点就够了。另外:语言名称是一个标识符,不要用单引号括起来:它应该是
language plpgsql
@KhachaturSaribekyan:如果这解决了您的问题,请接受答案,这样您的问题就标记为已解决。@KhachaturSaribekyan:如果这解决了您的问题,请接受答案,以便将您的问题标记为已解决。