Sql 在红移中将月度数据扩展到每日基准水平的备选方案

Sql 在红移中将月度数据扩展到每日基准水平的备选方案,sql,amazon-redshift,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

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

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

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 
目前的解决方案是,我使用left连接另一个表,该表包含日期值,如

    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'
但我认为可能有一种更优化的方法来解决这个问题,我可能没有意识到。 有谁有更好的解决方案,可以将数据从每月复制到全年的每天


非常感谢您的帮助

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

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(这是有意义的)

然而,总体而言,您的方法很有意义

您可以调整日历表,使其具有另一列的月初,例如
yyyyym
。然后,您可以将查询表述为:

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';

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

你的方法很好。这是红移的最佳方法。但是你也应该回过头来考虑一下为什么你需要像这样复制表格。也许没有必要&您可以在其他地方修改连接或其他内容。