SQL(RedShift):从一列时间戳

时间:2016-06-13 16:18:20

标签: 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中执行,还是我需要单独运行每个月的查询(通过像每个月计算不同的date_trunc(...)这样的事情)?

编辑:

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

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]错误:函数交叉表(“未知”,“未知”)不存在     提示:没有函数匹配给定的名称和参数类型。您可能需要添加显式类型转换。

3 个答案:

答案 0 :(得分:0)

不幸的是,Redshift不支持数据透视操作(即交叉表)。

你可以

  1. 执行Jorge在评论中建议的内容并手动选择必要的数据

  2. 如果该数据足够小,则输出到可以处理枢轴的程序中。

答案 1 :(得分:0)

您可以为每个月做一个案例陈述

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

答案 2 :(得分:0)

Redshift也不完全支持generate_series()(参见https://stackoverflow.com/a/34167753/3019685)。

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

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