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

Posted

技术标签:

【中文标题】SQL (RedShift):从时间戳列中为每个月选择不同的日期【英文标题】:SQL (RedShift): Select distinct dates for each month from a column of timestamps 【发布时间】:2016-06-13 16:18:19 【问题描述】:

我有一列时间戳

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

【问题讨论】:

是的。它被称为数据透视表。在这里搜索它,有成千上万的例子。尝试一些事情,如果做不到,请向我们展示您的尝试,我们很乐意为您提供帮助。 @JorgeCampos 谢谢。术语有所帮助。 @JorgeCampos 已编辑添加。不确定是什么问题。也许是红移特性? 添加您收到的错误消息。 @JorgeCampos 已更新。 【参考方案1】:

很遗憾,Redshift 不支持数据透视操作(即交叉表)。

你可以

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

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

【讨论】:

【参考方案2】:

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

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

【讨论】:

【参考方案3】:

Redshift 也不完全支持generate_series()(请参阅https://***.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

【讨论】:

这个问题要求 distinct 时间戳,所以我会稍微改变一下这个查询:select to_char(time_column, 'mon') as month, count(DISTINCT time_column) from your_table group by 1

以上是关于SQL (RedShift):从时间戳列中为每个月选择不同的日期的主要内容,如果未能解决你的问题,请参考以下文章

从返回的 Oracle 时间戳列中检索数据

Apache Spark 从时间戳列中减去天数

如何从 H2 中的时间戳列中提取日期

在 Oracle 时间戳列中以 UTC 保存日期

从纪元时间戳列中仅检索具有今天日期的记录

需要从redshift中的日期列中划分月份和年份