Вижте идеята зад заявката:
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)
Ще трябва да изберете начална и крайна дата според вашите изисквания. Заявката може да е доста скъпа (споменахте за милиарди пропуски), така че я прилагайте с повишено внимание (тествайте върху по-малък поднабор от данни или изпълнете на етапи).
При липса на generate_series()
можете да създадете свой собствен генератор. Ето един интересен пример
. Изгледи от цитираната статия могат да се използват вместо generate_series()
. Например, ако имате нужда от периода '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;
ще получите същия резултат като в първия пример.