在redshift中将每月数据扩展到每日基本水平的替代方法

时间:2018-09-15 11:58:18

标签: sql amazon-redshift

我最近解决了一个问题,但想看看是否有更好的选择。

目前,我有一个红移表,其中包含每种产品的每月销售目标。桌子看起来像这样

Start date     Product_id         Target
2018-08-01     100001             15000
2018-08-01     100002             12500
2018-08-01     100003             17500
2018-08-01     100004             16500
2018-08-01     100005             10000
2018-09-01     100001             15500
2018-09-01     100002             13500
2018-09-01     100003             18500
2018-09-01     100004             14500
2018-09-01     100005             14000
....           ...                ...
2018-12-31     100005             10000     

我要做的是复制表,以便将粒度从每月更改为每天,并在每个日期(即

)复制数据
    Start date     Product_id         Target
2018-08-01     100001             15000
2018-08-01     100002             12500
2018-08-01     100003             17500
2018-08-01     100004             16500
2018-08-01     100005             10000
2018-08-02     100001             15000
2018-08-02     100002             12500
2018-08-02     100003             17500
2018-08-02     100004             16500
2018-08-02     100005             10000
....           ...                ... 
2018-12-31     100005             20000 

当前的解决方案是,我将左连接与另一个包含

的日期级别的表一起使用
    Date
  2018-08-01
  2018-08-02
  2018-08-03
  ....
  2018-12-31 

我以这种方式进行左联接。我使用left join属性进行复制。

 SELECT 
   date_trunc('month', sales_tar.start_date), 
   dat.datevalue,
   sales_tar.product_id,
   sales_tar.target
 FROM 
   sales.sales_target sales_tar
 LEFT JOIN 
   datedata.caleanderdate dat ON sales_tar.start_date::date = 
   date_trunc('month', dat.datevalue)::date
 WHERE
   tar.start_date::date BETWEEN '2018-08-01' AND '2018-12-31'

但是我认为可能有一种更优化的方法来解决该问题,而我可能没有意识到。 有没有人有更好的解决方案,可以将全年的数据从每月一次复制到每天一次?

非常感谢您的帮助

1 个答案:

答案 0 :(得分:1)

您可以通过删除看起来不必要的类型转换来稍微清理一下查询:

SELECT st.start_date, cdd.datevalue,
       st.product_id, st.target
FROM sales.sales_target st LEFT JOIN 
     datedata.caleanderdate cd
     ON st.start_date = date_trunc('month', cd.datevalue)
WHERE st.start_date BETWEEN '2018-08-01' AND '2018-12-31';

这假定日期值已经是date s(有意义)。

但是,总体而言,您的方法很有道理。

您可以调整日历表,使其在月初具有另一列,例如yyyymm。然后,您可以将查询的短语设置为:

SELECT st.start_date, cdd.datevalue,
       st.product_id, st.target
FROM sales.sales_target st LEFT JOIN 
     datedata.caleanderdate cd
     ON st.start_date = cd.yyyymm
WHERE st.start_date BETWEEN '2018-08-01' AND '2018-12-31';

在某些数据库中,这将提高性能。不过,我不确定这是否会对Redshift产生很大的影响。