PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Füllen Sie die Tabelle mit Daten für fehlendes Datum (postgresql, redshift)

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.