可以使用redshift存储的proc来进行日期范围UNION ALL查询

时间:2019-06-18 14:19:19

标签: amazon-redshift

由于redshift本身不支持日期分区,所以除了redshift频谱外,我们所有的表都进行了日期分区

my_table_name_YYYY_MM_DD

所以每次我们查询时,通常看起来都是这样

select columns, i, want from
(select * from tbl1_date UNION ALL 
select * from tbl2_date UNION ALL 
select * from tbl3_date UNION ALL 
select * from tbl4_date);

每天有一个UNION ALL。

存储过程可以生成日期范围吗,所以当我向他们发送python或bash脚本来生成日期范围时,我们的业务分析师就不会失去头发吗?

1 个答案:

答案 0 :(得分:0)

是的,您可以创建一个存储过程,该存储过程仅使用所需的表来生成动态SQL。请在这里查看我的答案,以获取以下模板作为模板:Issue with passing column name as a parameter to "PREPARE" in Redshift

但是,您应该意识到Redshift可以使用“时间序列表”视图自动实现您想要的大部分功能。记录在这里:

您定义一个视图,该视图由一系列相同表上的UNION ALL组成,并在通常过滤的日期或时间戳列上定义了排序键。当您查询该视图时,Redshift可以消除对不包含相关数据的所有UNION表的扫描。

例如:

CREATE OR REPLACE VIEW  store_sales_vw
AS        SELECT * FROM store_sales_1998
UNION ALL SELECT * FROM store_sales_1999
UNION ALL SELECT * FROM store_sales_2001
UNION ALL SELECT * FROM store_sales_2002
UNION ALL SELECT * FROM store_sales_2003
; 

SELECT cd.cd_education_status
      ,COUNT(*) sales_count
      ,AVG(ss_quantity) avg_quantity
FROM store_sales_vw vw
JOIN customer_demographics cd
ON vw.ss_cdemo_sk = cd.cd_demo_sk
WHERE ss_sold_ts BETWEEN '1999-09-01' AND '2000-08-31'
GROUP BY cd.cd_education_status

在此示例中,Redshift将仅使用store_sales_1999store_sales_2000表,而跳过视图中的其他表。请注意,表跳过不是基于表的名称。 Redshift知道每个表中排序键时间戳的MIN和MAX值。

如果您采用这种方法,请确保将UNION的总大小保持较低。我建议(最多)上周[7]的每日表格,上个月[5]的每周表格,去年[4]的季度表格以及旧数据的年度表格。

您可以使用ALTER TABLE … APPEND将每日表格合并到每周表格中,依此类推。