Postgres / Redshift:通过一次通话从一组中提取季度和年份?

时间:2016-04-29 15:20:16

标签: sql postgresql amazon-redshift

我想知道是否有办法从Redshift / Postgres DB的一个电话中的日期列中提取年份和季度,以便我将它们分组?

由于查询速度对我来说非常重要,我目前将年份和列作为两列以及我不满意的日期,因为我在日期列中有这些信息,但它们的查询速度几乎快了两倍如果我加入他们而不是在日期使用两个extract()来电来获得年份和季度。

例如

Select SUM(some_column), 
EXTRACT(YEAR FROM the_date) as year_date,
EXTRACT(YEAR FROM the_date) as q_date
FROM table
Group by year_date, q_date;

vs

Select SUM(some_column), 
year_date,
q_date
FROM table
Group by year_date, q_date;

我会寻找这样的东西:

Select SUM(some_column), 
extract(Year | Quarter from the _date) AS year_q
FROM table
Group by year_q;

我尝试了to_char方法,但它比上面的两个选项都要慢。

谢谢

1 个答案:

答案 0 :(得分:0)

我认为这是出于分析目的。 如其中一项建议中所建议的,最好从the_date列中为年,季度和年-季度实现单独的列。这样,您可以使用它们按年,跨年或季度的季度编号进行分组。但是,具体实现的列实际上取决于分析要求。

要回答您的特定问题,可以假设您有一个下表。

create table source_table (
    some_column         int,
    the_date            timestamp
);

您可以使用以下形式的CTAS查询来创建一个适用于此分析的表。

create table analytics_table as (
    select
        some_column,
        extract(year from the_date) as year,
        extract(quarter from the_date) as quarter,
        extract(year from the_date) || '-' || extract(quarter from the_date) as year_quarter
    from
        source_table
);

然后您可以在此表上运行以下形式的查询,该查询的执行速度会更快。

select
    year,
    sum(some_column)
from
    analytics_table
group by
    year
;

select
    year_quarter,
    sum(some_column)
from
    analytics_table
group by
    year_quarter
;