【发布时间】: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) 深层复制将这些列添加到数据中,它应该使您的查询更加高效。
标签: sql postgresql amazon-redshift