0

I have the following pg script

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';

After running the above mentioned pg script I could get the data

select * from ended_jobs()

How can I write 'for loop' inside the right join to avoid multiple 'union all', like this

.......
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;
........
1
  • Unrelated, but: you don't need plpgsql for this. A simple SQL function will be enough. Also: the language name is an identifier, do not put that into single quotes: it should be language plpgsql Commented May 23, 2018 at 7:33

1 Answer 1

2

You can use generate_series() for that:

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 .... 

You can also move the date_trunc() into that:

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
Sign up to request clarification or add additional context in comments.

1 Comment

@KhachaturSaribekyan: if that solved you problem, please accept the answer so that your question is marked as resolved.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.