Mire la idea detrás de la consulta:
select distinct on (domain, new_date) *
from (
select new_date::date
from generate_series('2016-04-12', '2016-04-17', '1d'::interval) new_date
) s
left join a_table t on date <= new_date
order by domain, new_date, date desc;
new_date | domain | date | visitors | hits
------------+-----------------+------------+----------+-------
2016-04-12 | www.domain1.com | 2016-04-12 | 1231 | 23423
2016-04-13 | www.domain1.com | 2016-04-13 | 1374 | 26482
2016-04-14 | www.domain1.com | 2016-04-13 | 1374 | 26482
2016-04-15 | www.domain1.com | 2016-04-13 | 1374 | 26482
2016-04-16 | www.domain1.com | 2016-04-13 | 1374 | 26482
2016-04-17 | www.domain1.com | 2016-04-17 | 1262 | 21493
(6 rows)
Deberá elegir las fechas de inicio y finalización de acuerdo con sus requisitos. La consulta puede ser bastante costosa (mencionó sobre brechas de miles de millones), así que aplíquela con precaución (pruebe en un subconjunto de datos más pequeño o ejecute por etapas).
En ausencia de generate_series()
Puedes crear tu propio generador. Este es un ejemplo interesante
. Las vistas del artículo citado se pueden usar en lugar de generate_series()
. Por ejemplo, si necesita el período '2016-04-12' + 5 days
:
select distinct on (domain, new_date) *
from (
select '2016-04-12'::date+ n new_date
from generator_16
where n < 6
) s
left join a_table t on date <= new_date
order by domain, new_date, date desc;
obtendrás el mismo resultado que en el primer ejemplo.