Postgres / Redshift:在一次调用中从组的日期列中提取季度和年份?

Posted

技术标签:

【中文标题】Postgres / Redshift:在一次调用中从组的日期列中提取季度和年份?【英文标题】:Postgres/Redshift: Extract Quarter and Year from date column for a group by in one call? 【发布时间】:2016-04-29 15:20:16 【问题描述】:

我想知道是否有一种方法可以在 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;

对比

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 方法,但它比上述两个选项都慢。

谢谢

【问题讨论】:

你有多少条记录?您的集群中有多少个节点?您是否尝试填充仪表板? 大约 80 亿条记录,4 个 8xlarge 节点,不,这只是对前端的查询。有时我想在几年内按周、季度、月等查看结果。等等我的问题中的查询。 您应该尝试使用 WINDOW 函数 (docs.aws.amazon.com/redshift/latest/dg/c_Window_functions.html) 而不是 GROUP BY 函数。 我以前从未听说过 windows,只是尝试根据文档整理一个查询,但在我的情况下它似乎比使用 group by 慢得多。 Select EXTRACT(YEAR FROM the_date) as year_date, EXTRACT(YEAR FROM the_date) as q_date, sum(some_column) over (partition by year_date, q_date order by year_date, q_date rows unbounded preceding) as sum FROM table order by year_date, q_date;还是我用错了? 如果您在窗口中使用诸如 EXTRACT 之类的功能,Redshift 需要扫描所有数据来构建它,这会比较慢。您可以尝试使用 Create Table as Select (CTAS) 深层复制将这些列添加到数据中,它应该使您的查询更加高效。 【参考方案1】:

我认为这是出于分析目的。 正如其中一个 cmets 所建议的,最好从 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
;

【讨论】:

以上是关于Postgres / Redshift:在一次调用中从组的日期列中提取季度和年份?的主要内容,如果未能解决你的问题,请参考以下文章

REDSHIFT:如何生成一系列数字而不在 redshift (Postgres 8.0.2) 中创建名为“数字”的表?

将 Postgres RDS 模式复制到 Redshift

Postgres/Redshift DATEDIFF 转换为 FLOAT

dbplyr 当前是不是假设 redshift 连接实际上是 postgres 连接?

将一张表从 RDS / postgres 加载到 Redshift

过滤器(其中......),可用于Postgres,但不能用于Redshift。