Подсчитайте регистр между датами

#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 января, что, по-видимому, соответствует тому, о чем вы спрашиваете.