我最近解决了一个问题,但想看看是否有更好的选择。
目前,我有一个红移表,其中包含每种产品的每月销售目标。桌子看起来像这样
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'
但是我认为可能有一种更优化的方法来解决该问题,而我可能没有意识到。 有没有人有更好的解决方案,可以将全年的数据从每月一次复制到每天一次?
非常感谢您的帮助
答案 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产生很大的影响。