I have a following query:
WITH t as (
SELECT date_trunc('hour', time_series) as trunc
FROM generate_series('2013-02-27 22:00'::timestamp, '2013-02-28 2:00',
'1 hour') as time_series
GROUP BY trunc
ORDER BY trunc
)
SELECT DISTINCT ON(trunc) trunc, id
FROM t
LEFT JOIN (
SELECT id, created, date_trunc('hour', created) as trunc_u
FROM event
ORDER BY created DESC
) u
ON trunc = trunc_u
which yields the following result:
"2013-02-27 22:00:00";
"2013-02-27 23:00:00";2
"2013-02-28 00:00:00";5
"2013-02-28 01:00:00";
"2013-02-28 02:00:00";
Table event
has id
, created
and some other columns, but only those are relevant here. The query above gives me id
of last event generated per given trunc
time period (thanks to DISTINCT ON
I get a nice aggregation per period).
Now, this query yields NULL
if no events happened in given time period. I would like it to return the previous available id
, even if it is from different time period. I.e.:
"2013-02-27 22:00:00";0
"2013-02-27 23:00:00";2
"2013-02-28 00:00:00";5
"2013-02-28 01:00:00";5
"2013-02-28 02:00:00";5
I am sure I am missing some easy way to accomplish this. Any advice?
You ca mix a self join and windows functions
Simplifying I take this table with this sample values:
In your query
a
istrunc_u
andb
is yourid
. The query is:And results:
Try:
If it is too slow - tell me. I will give you a faster query.