У меня есть следующая таблица (таблица продуктов):
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 апреля товар прекращен