Получение данных за прошедшие месяцы - PullRequest
0 голосов
/ 28 апреля 2020

У меня есть следующая таблица (таблица продуктов):

productid    status      started      terminated    break_begin    break_end    value  
 1           active      2020-01-01                                              15  
 2           terminated  2020-02-04   2020-04-06                                 10  
 3           active      2020-01-15                 2020-02-15     20-02-29      5  
 4           paused      2020-02-01                 2020-04-15     20-04-30      25  
 5           terminated  2019-12-31   2020-03-21                                 20  
 6           active      2020-04-01                                              12

Так что, если я хочу узнать, какие продукты в настоящее время активны, я отфильтрую по status -> status= 'active'
Но если я хочу знать, какие продукты были активны в прошлом месяце в марте (скажем, в последний день марта), я больше не могу фильтровать по статусу. Поскольку статус продукта будет меняться со временем в зависимости от того, находится ли продукт на паузе, прекращен или даже не запущен.
Продукт активен, когда:

  • Когда продукт запущен
  • когда продукт не завершен
  • и когда продукт не остановлен

Так что я должен сделать что-то подобное в where clause:

where started <= '2020-03-31' AND terminated IS NULL or terminated > '2020-03-31' AND ........

Так как я смотрю только в последний день месяца, я удостоверяюсь, что продукт был запущен до этой даты, и что до этой даты нет terminated_date, и в эту дату также нет перерыва.

Я мог бы сделать это на февраль или на любой другой месяц.

Но мой goal - получить список за месяц, а не за один месяц. Я хочу SUM из value всех активных продуктов за последние 4 месяца.

Вот так (цифры только примеры):

January  February   March   April  
32        47         50      40

Моя первая идея - получить список месяцев с последним днем:

generate_series('2020-01-01'::date, NOW(),'1 month') 

И вычислите затем последний день каждого месяца. После этого я бы использовал это вычисленное поле для условий в where clause

Я не уверен, что это правильный путь. Я уже пробовал это, но я вроде застрял.

Explanation: When a product is active:

Продукт активен до тех пор, пока не будет прекращен или продукт в настоящее время перерыв (пауза) Например, мы смотрим на продукт с id 2
started -> 4 февраля
terminated -> 4 апреля
Итак, с 4 февраля по 4 апреля продукт был активен. С 4 апреля товар прекращен

1 Ответ

0 голосов
/ 28 апреля 2020

Вы можете получить строки, связанные с каждым продуктом по состоянию на последний день месяца, используя distinct on:

select distinct on (gs.date, t.product_id) gs.date + interval '1 month' - interval '1 day' as month,
       t.*
from t join
     generate_series('2020-01-01'::date, now(), '1 month') gs(dte)
     on t.started <= gs.date + interval '1 month' - interval '1 day'
order by gs.date, t.product_id;

Это может ответить на ваш вопрос. Если нет, вы можете использовать это как подзапрос или CTE. Мне трудно найти объяснение тому, что является активным.

...