Kijk naar het idee achter de vraag:
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)
U moet de start- en einddatum kiezen op basis van uw vereisten. De zoekopdracht kan vrij duur zijn (u noemde over miljarden hiaten), dus pas deze voorzichtig toe (test op een kleinere gegevenssubset of voer deze stapsgewijs uit).
Bij afwezigheid van generate_series()
je kunt je eigen generator maken. Hier is een interessant voorbeeld
. Weergaven van het geciteerde artikel kunnen worden gebruikt in plaats van generate_series()
. Als u bijvoorbeeld de periode '2016-04-12' + 5 days
. nodig heeft :
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;
je krijgt hetzelfde resultaat als in het eerste voorbeeld.