Regardez l'idée derrière la requête :
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)
Vous devrez choisir des dates de début et de fin en fonction de vos besoins. La requête peut être assez coûteuse (vous avez mentionné des milliards d'écarts), alors appliquez-la avec prudence (testez sur un sous-ensemble de données plus petit ou exécutez par étapes).
En l'absence de generate_series()
vous pouvez créer votre propre générateur. Voici un exemple intéressant
. Les vues de l'article cité peuvent être utilisées à la place de generate_series()
. Par exemple, si vous avez besoin de la période '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;
vous obtiendrez le même résultat que dans le premier exemple.