PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Remplissez le tableau avec des données pour la date manquante (postgresql, redshift)

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.