在postgres的学年组

时间:2016-09-22 08:34:21

标签: postgresql group-by

我有一个查询,我计算每年的行数:

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

但是我希望从9月到9月,而不是1月到1月。因此按学年而不是历年分组。

我可以修改我的查询吗?

更一般地说,是否可以按时间范围进行分组并指定偏移量,例如:extract(year from activated_at offset interval 2 month) as year(这不起作用,只是我想要的想法)

2 个答案:

答案 0 :(得分:2)

你真正想要的是将9月之后的所有日期视为"明年",所以以下内容应该有效:

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;

答案 1 :(得分:1)

假设某人的activated_at是2016-09-01'应计为year = 2017,在activated_at(翻译(在数学意义上)9月到1月)时,您可以将extract添加4个月。

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个月。