Альтернативы для расширения месячных данных до дневного базового уровня в красном смещении - PullRequest
0 голосов
/ 15 сентября 2018

Есть проблема, которую я недавно решил, но хотел бы посмотреть, есть ли лучшая альтернатива.

В настоящее время у меня есть таблица красного смещения, в которой указана месячная цель продаж для каждого продукта.Таблица выглядит следующим образом:

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 
* 1008.* В настоящее время решение состоит в том, что я использую левое соединение с другой таблицей, которая содержит значение даты на уровне дня, например
    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 голосов
/ 15 сентября 2018

Вы можете немного очистить свой запрос, удалив ненужные преобразования типов:

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.

...