#python #postgresql
#python #postgresql
Вопрос:
У меня есть таблица со столбцом ‘time’, который состоит из time с отметкой времени. В нем есть данные с января по август. Я хочу выбрать этот столбец таким образом, чтобы за раз принималось только 7 дней, и этот процесс повторялся до конца таблицы.
Итак, допустим, у меня есть данные с 1 по 15 число определенного месяца.Сначала мне нужны данные с 1-го по 7-й. Тогда мне нужны данные со 2-го по 8-е …. и так далее.
Есть идеи о том, как это сделать?
P.S. Я использую Python и PostgresSQL
Комментарии:
1. Не уверен насчет части Python, но ознакомьтесь pypi.org/project/psycopg2 для подключения к Python.
2. Добавьте некоторые образцы данных и желаемый результат, чтобы лучше понять это. Также укажите, хотите ли вы сделать это через python или postgresql
Ответ №1:
Для такого скользящего окна я рекомендую сначала сгенерировать ряд. Вы можете сделать это, настроив первые два параметра generate_series()
вызова:
select begin_date, begin_date interval '7 days' as end_date
from generate_series('2020-07-01'::timestamp,
'2020-07-15'::timestamp - interval '7 days',
interval '1 day') as gs(begin_date)
;
begin_date | end_date
--------------------- ---------------------
2020-07-01 00:00:00 | 2020-07-08 00:00:00
2020-07-02 00:00:00 | 2020-07-09 00:00:00
2020-07-03 00:00:00 | 2020-07-10 00:00:00
2020-07-04 00:00:00 | 2020-07-11 00:00:00
2020-07-05 00:00:00 | 2020-07-12 00:00:00
2020-07-06 00:00:00 | 2020-07-13 00:00:00
2020-07-07 00:00:00 | 2020-07-14 00:00:00
2020-07-08 00:00:00 | 2020-07-15 00:00:00
(8 rows)
Затем вы можете присоединить это к своей таблице данных, используя begin_date
и end_date
в качестве ограничений.
select gs.begin_date, gs.begin_date interval '7 days', d.*
from generate_series('2020-07-01'::timestamp,
'2020-07-15'::timestamp - interval '7 days',
interval '1 day') as gs(begin_date)
left join my_data_table d
on d.timestamp_column >= gs.begin_date
and d.timestamp_column < gs.begin_date interval '7 days'
;
Это вернет каждую строку, которая попадает в каждое begin_date
и end_date
сопряжение.