Как я могу получить данные из таблицы в пределах только 7-дневного диапазона?

#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 сопряжение.