PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Попълнете таблицата с данни за липсваща дата (postgresql, червено отместване)

Вижте идеята зад заявката:

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)

Ще трябва да изберете начална и крайна дата според вашите изисквания. Заявката може да е доста скъпа (споменахте за милиарди пропуски), така че я прилагайте с повишено внимание (тествайте върху по-малък поднабор от данни или изпълнете на етапи).

При липса на generate_series() можете да създадете свой собствен генератор. Ето един интересен пример . Изгледи от цитираната статия могат да се използват вместо generate_series() . Например, ако имате нужда от периода '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;

ще получите същия резултат като в първия пример.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Присъединете се към един към много и извлечете един резултат

  2. psql.exe - неуспешно удостоверяване на парола в windows

  3. Преместването на база данни с pg_dump и psql -U postgres db_name <... води до ГРЕШКА:релацията table_name не съществува

  4. Създайте неизменен клонинг на concat_ws

  5. Изчислете възрастта в години в PostgreSQL