Postgres按季度分组

时间:2016-05-06 11:49:15

标签: postgresql

我的表有列:topic,person,published_date。我想创建一个查询,帮助我计算每个人在每个季度在特定主题中写的次数。例如:

topic person published_date

'world'  JS   2016-05-05 
'world'  JS   2016-05-10
'nature'  AR   2016-12-01

应该返回类似

的内容
topic person quarter how_many_times
'world'  JS     2          2
'nature' AR     4          1

我可以按主题和人物分组

select topic, person, published_date, count(*) from table group by topic, person, published_date

但是如何将group_date发布到宿舍?

3 个答案:

答案 0 :(得分:10)

假设published_date是日期类型列,您可以使用extract函数,如下所示:

select 
  topic, 
  person,
  extract(quarter from published_date) as quarter, 
  count(*)
from 
  table1
group by 
  topic, 
  person,
  extract(quarter from published_date)
order by 
  extract(quarter from published_date) asc

Sample SQL Fiddle

如果日期可能属于不同年份,您可能希望将年份添加到选择和分组中。

答案 1 :(得分:0)

如果某人也需要年份,则可以使用此年份:

SELECT (extract(year from published_date)::text || '.Q' || extract(quarter from published_date)::text) as quarter

这将以2018.Q1的形式返回值。

它如何工作?它提取年份和季度(均为double precision类型),并将其转换为字符串,然后以可读的方式将整体串联起来。

答案 2 :(得分:0)

如果需要季度和年份,可以使用date_trunc

SELECT
  date_trunc('quarter', published_date) AS quarter

这将日期四舍五入到该季度的开始,例如2020-04-01,其优点是管道中的后续步骤可以像正常日期一样读取它。

(与extractextract(quarter FROM published_date))比较,它给出了四分之一的数字,即1、2、3或4。)