SQL(红移):从一列时间戳中为每个月选择不同的日期

SQL(红移):从一列时间戳中为每个月选择不同的日期,sql,postgresql,amazon-redshift,Sql,Postgresql,Amazon Redshift,我有一列时间戳: time_column 2016-02-02 08:09:59.351000 2016-02-02 15:09:21.756000 2016-02-02 15:42:33.287000 2016-02-02 15:53:26.394000 我想编写一个查询,输出给定月份的不同时间戳 因此,输出将是 jan feb mar apr may jun .... 9 1 10 ... 这是否可以在sql中实现,或者我

我有一列时间戳:

time_column
2016-02-02 08:09:59.351000
2016-02-02 15:09:21.756000
2016-02-02 15:42:33.287000
2016-02-02 15:53:26.394000
我想编写一个查询,输出给定月份的不同时间戳

因此,输出将是

jan    feb    mar    apr    may    jun     ....
 9      1      10    ...
这是否可以在sql中实现,或者我是否需要为每个月分别运行查询(通过对每个月的不同日期(…)进行计数)

编辑:

根据查看透视表的建议,我尝试构建如下解决方案(但我认为红移接受交叉表可能存在问题)。我希望真正的问题是我的疑问,而不是红移

SELECT * FROM crosstab(
$$SELECT
    column1,
    column2,
    date_part('Month', my_timestamp) as month,
    count(date_trunc('Month',my_timestamp))
FROM my_table
GROUP BY column1, column2, month$$,

$$SELECT m FROM generate_series(1,6) m$$
) AS (
              column1 CHARACTER VARYING,
              column2 CHARACTER VARYING,
              "Jan" INT,
              "Feb" INT,
              "Mar" INT,
              "Apr" INT,
              "May" INT,
              "Jun" INT
)
抛出错误:

[42883]错误:函数交叉表(“未知”、“未知”)不存在 提示:没有与给定名称和参数类型匹配的函数。您可能需要添加显式类型转换


不幸的是,红移不支持透视操作(即交叉表)

你也可以

  • 按照Jorge在评论中的建议,手动选择必要的数据

  • 如果数据足够小,输出到一个可以处理枢轴的程序中


  • 你可以为每个月做一个案例陈述的总和

    select 
    sum(case when extract('month' from time_column) = 1 then 1 else 0 end) Jan,
    sum(case when extract('month' from time_column) = 2 then 1 else 0 end) Feb,
    ....
    from table_name
    

    红移也不完全支持
    generate_series()
    (请参阅)

    这将为您提供所需但未格式化为一行的数据:

    select to_char(time_column, 'mon') as month, count(*) from your_table group by 1
    
     month | count
    -------+-------
     jun   |   166
     feb   |     1
     mar   |    59
     may   |   198
     apr   |   231
    

    是的。它被称为数据透视表。在这里搜索,有成千上万的例子。尝试一些东西,然后,如果你做不到,告诉我们你尝试了什么,我们会很乐意帮助你。@JorgeCampos谢谢。“术语有帮助。”JorgeCampos编辑并添加。不知道问题是什么。可能是红移特性?添加您收到的错误消息。@JorgeCampos已更新。问题要求使用不同的时间戳,因此我会稍微更改此查询:
    选择以月为单位显示字符(时间列,'mon'),以1为单位从\u表组中计数(不同的时间列)