ETL с использованием SQL для Postgres - PullRequest
0 голосов
/ 08 октября 2018

У меня есть следующие данные в таблице PostgreSQL.Это почасовые данные с пропущенными часами.Я хочу вставить значения NULL для каждых пропущенных почасовых данных.

Пример: у нас отсутствуют данные для 9/9/2018 22:00.Я заблудился, как сделать это в SQL.

time             id     
----------------------------------------------------
9/9/2018 16:00  22d52ac5-6fdc-42c8-8a0e-0a7570ed6b92        
9/9/2018 17:00  6c6bc938-4a46-4bf2-a81e-81ded6f9bdb6        
9/9/2018 18:00  67c85ca5-7f85-49a1-8eb2-af6307d5277b        
9/9/2018 19:00  0d58a4d7-30ec-429c-9eb8-0f490b18a020        
9/9/2018 19:00  81870c59-410c-4d1b-8178-e5cc3f3fc4e3        
9/9/2018 19:00  a06697ee-88e6-4c26-adbb-4b59c3fe95b3        
9/9/2018 21:00  ea8a5bf8-18ff-4506-ad11-07df86c162ab        
9/10/2018 8:00  9c08ae16-3f5b-4b36-97ac-9910c9a8b6b3        
9/10/2018 8:00  fbb18c1b-92db-495c-87d0-09af9fb3d2ab        
9/10/2018 8:00  bf81644f-8ea1-474e-8fcc-26e1ff94c436        
9/10/2018 8:00  1a6b7ca3-3728-4ed0-b387-f03c46b6d597        
9/10/2018 11:00 24fbd4aa-d745-4994-a14d-93443880bdf7        
9/10/2018 15:00 7ac9376d-aee9-4c22-a794-315973aab597

Может кто-нибудь, пожалуйста, посоветуйте с запросом, если это возможно.

Ответы [ 3 ]

0 голосов
/ 08 октября 2018

Сделайте левое внешнее соединение с этим на левой стороне:

generate_series('2018-09-09 16:00:00'::timestamptz,
                '2018-09-10 15:00:00'::timestamptz,
                '1 hour'::interval)
0 голосов
/ 08 октября 2018

Используйте функцию generate_series () для генерации 24 часов, а затем примените левое соединение

demo

with cte1 as
(
select '9/9/2018 16:00' as t,  '22d52ac5-6fdc-42c8-8a0e-0a7570ed6b92' as id
union
select '9/9/2018 22:00' as t,  '22d52ac5-6fdc-42c8-8a0e-0a7570ed6b92' as id

)
select distinct t1,case when t1=t::time then t else null end as t,case when t1=t::time then id else null end as id from 
(
SELECT distinct '00:00:00'::time + x * '1 minute'::interval as t1
FROM generate_series(0, 60*24, 60) AS t(x)
)a left join cte1 b on a.t1=b.t::time
0 голосов
/ 08 октября 2018

Я бы сказал:

Если вы не можете добавить эту функцию из-за программной реализации в своем приложении, вы можете добавить ее в качестве триггера в вашу базу данных перед добавлением новой записи вставки.

Я не знаю, какую базу данных вы используете, но она дает вам несколько ссылок:

Идея довольно проста:

  1. Проверьте записи перед вставкой.
  2. Рассчитайте разницу между новой записью, которую вы хотите вставить, и последней записью в базе данных.
  3. Добавьте отсутствующие записи, о которых вы говорите.
  4. Добавьте новую запись.

Я бы настоятельно рекомендовал вам не делать этого и так, и решить это в вашем приложении внешнего или внутреннего интерфейса.В функции, которую вы можете использовать в своем приложении, которая собирает все эти данные из вашей базы данных, можно расширить ее функциональность, включив эту, которую вы говорите.При этом вы не будете добавлять ненужные данные в вашу систему хранения.Вы бы не использовали пустое место ни для чего, кроме увеличения управления базой данных, производительности и т. Д.

Надеюсь, это поможет,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...