sql >> Database >  >> RDS >> PostgreSQL

Vul de tabel met gegevens voor ontbrekende datum (postgresql, roodverschuiving)

Kijk naar het idee achter de vraag:

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)

U moet de start- en einddatum kiezen op basis van uw vereisten. De zoekopdracht kan vrij duur zijn (u noemde over miljarden hiaten), dus pas deze voorzichtig toe (test op een kleinere gegevenssubset of voer deze stapsgewijs uit).

Bij afwezigheid van generate_series() je kunt je eigen generator maken. Hier is een interessant voorbeeld . Weergaven van het geciteerde artikel kunnen worden gebruikt in plaats van generate_series() . Als u bijvoorbeeld de periode '2016-04-12' + 5 days . nodig heeft :

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;

je krijgt hetzelfde resultaat als in het eerste voorbeeld.



  1. een mysql-tabel maken vanuit een inner join

  2. Een externe sleutel toevoegen aan een bestaande tabel in SQLite

  3. Basis SQL-query's

  4. Wat is SQL? Wat is een databank? Relationele databasebeheersystemen (RDBMS) uitgelegd in gewoon Engels.