2016-09-22 3 views
0

У меня есть запрос, где я сосчитать количество строк для каждого года:Группа по учебному году в Postgres

SELECT 
    count(*) as activation_count 
, extract(year from activated_at) as year 
FROM "activations" 
WHERE ... 
GROUP BY year 

Но я хотел бы вместо того, чтобы иметь лет, начиная с сентября по сентябрь вместо января до января , Таким образом, группировка по школьным годам вместо календарных лет.

Могу ли я изменить свой запрос, чтобы сделать это?

И в более общем плане, можно сгруппировать по диапазону времени и указать смещение к нему, например: extract(year from activated_at offset interval 2 month) as year (это не работает, а только о том, что я хочу)

ответ

1

Если предположить, что кто-то, чьи activated_at is '2016-09-01' следует считать year = 2017, вы можете добавить 4 месяца до activated_at, когда в extract (перевод (в математическом смысле слова) с сентября по январь).

SELECT * FROM activations ; 
┌────────────────────────┐ 
│  activated_at  │ 
├────────────────────────┤ 
│ 2016-08-01 00:00:00+02 │ 
│ 2016-09-01 00:00:00+02 │ 
│ 2016-10-01 00:00:00+02 │ 
│ 2017-02-02 00:00:00+01 │ 
└────────────────────────┘ 
(4 rows) 


SELECT COUNT(*), 
     EXTRACT(year FROM (activated_at + '4 months'::interval)) AS year 
FROM activations 
GROUP BY year; 
┌───────┬──────┐ 
│ count │ year │ 
├───────┼──────┤ 
│  3 │ 2017 │ 
│  1 │ 2016 │ 
└───────┴──────┘ 
(2 rows) 

Если это должно быть расценено как year = 2016 вы можете удалить 8 месяцев вместо этого.

1

То, что вы в основном хотят, чтобы лечить все даты после сентября, как «в следующем году», так что должно работать:

select count(*) as activation_count, 
     case 
      when extract(month from activated_at) >= 9 then extract(year from activated_at) + 1 
      else extract(year from activated_at) 
     end as school_year 
from activations 
group by school_year; 
Смежные вопросы