Sehen Sie sich die Idee hinter der Abfrage an:
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)
Sie müssen das Start- und Enddatum entsprechend Ihren Anforderungen auswählen. Die Abfrage kann ziemlich teuer sein (Sie erwähnten etwa Milliarden Lücken), also wenden Sie sie mit Vorsicht an (testen Sie mit einer kleineren Datenteilmenge oder führen Sie sie schrittweise aus).
In Abwesenheit von generate_series()
Sie können Ihren eigenen Generator erstellen. Hier ist ein interessantes Beispiel
. Ansichten aus dem zitierten Artikel können anstelle von generate_series()
verwendet werden . Wenn Sie beispielsweise den Zeitraum '2016-04-12' + 5 days
benötigen :
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;
Sie erhalten dasselbe Ergebnis wie im ersten Beispiel.