我有一列时间戳:
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]错误:函数交叉表(“未知”,“未知”)不存在 提示:没有函数匹配给定的名称和参数类型。您可能需要添加显式类型转换。
答案 0 :(得分:0)
不幸的是,Redshift不支持数据透视操作(即交叉表)。
你可以
执行Jorge在评论中建议的内容并手动选择必要的数据
如果该数据足够小,则输出到可以处理枢轴的程序中。
答案 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