#sql #database #postgresql
Вопрос:
У меня есть таблица курсов (название, дата начала, дата окончания), и мне нужно подсчитывать каждый курс за каждый год между датой начала и датой окончания.
Например, имея такой образец:
| name | start_date | end_date |
----------------------------------
| c1 | 2019-01-01 | 2022-12-01 |
| c2 | 2020-01-01 | 2025-12-01 |
| c3 | 2018-01-01 | 2022-12-01 |
Мне нужно вернуть, сколько курсов было активно за эти годы, что-то вроде этого:
| year | count_courses |
| 2018 | 1 |
| 2019 | 2 |
| 2020 | 3 |
| 2021 | 3 |
| 2022 | 3 |
| 2023 | 1 |
| 2024 | 1 |
| 2025 | 1 |
Возможно ли это?
Ответ №1:
Сгенерируйте годы, а затем используйте какую-то агрегацию. Такие как:
select gs.yyyy, count(s.start_date)
from generate_series('2018-01-01'::date,
'2025-01-01'::date,
interval '1 year'
) gs(yyyy) left join
sample s
on s.start_date <= gs.yyyy and
s.end_date > gs.yyyy
group by gs.yyyy;
Это подсчитывает количество активных на 1 января, что, по-видимому, соответствует тому, о чем вы спрашиваете.