sql >> Base de Datos >  >> RDS >> PostgreSQL

Llene la tabla con datos para la fecha que falta (postgresql, corrimiento al rojo)

Mire la idea detrás de la consulta:

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)

Deberá elegir las fechas de inicio y finalización de acuerdo con sus requisitos. La consulta puede ser bastante costosa (mencionó sobre brechas de miles de millones), así que aplíquela con precaución (pruebe en un subconjunto de datos más pequeño o ejecute por etapas).

En ausencia de generate_series() Puedes crear tu propio generador. Este es un ejemplo interesante . Las vistas del artículo citado se pueden usar en lugar de generate_series() . Por ejemplo, si necesita el período '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;

obtendrás el mismo resultado que en el primer ejemplo.