База данных запросов и группа по понедельникам недели - PullRequest
0 голосов
/ 24 февраля 2019

У меня есть большая база данных с этими полями

date         sku    sales
2019-02-23   123    20
2019-02-24   123    33
2019-02-25   123    45
2019-02-20   456    15
2019-02-22   456    23

И я хотел бы получить общую ПРОДАЖУ В НЕДЕЛЮ, но самое сложное в том, что мне нужно предположить, что самая ранняя дата из каждого SKU - этоПонедельник, поэтому таблица должна выглядеть следующим образом:

date         sku    sales
2019-02-18   123    20
2019-02-19   123    33
2019-02-20   123    45
2019-02-18   456    15
2019-02-20   456    23

Ожидаемый результат должен быть:

date         sku    sales
W1           123    98
W1           456    38
  • SKU с более чем 7 днями, если GROUP BY W1 и W2

Так что теперь я могу GROUP BY неделю, так как все продажи sku 123 упадут на той же неделе.Теперь для SKU с более чем 7 днями продаж 8-й день снова будет понедельником после конвертации.По сути, я хочу добавить продажи, но ДО этого предположим, что самая ранняя дата для каждого SKU - это первый понедельник этой недели (сдвиньте дату на столько дней, сколько потребуется, чтобы сделать первую запись понедельником. ОдинВозможная проблема заключается в том, что записи не сортируются по соответствующему полю.

Thx!

1 Ответ

0 голосов
/ 24 февраля 2019

Ниже для BigQuery Standard SQL

#standardSQL
SELECT 
  CONCAT('W', CAST(DIV(DATE_DIFF(t.date, start_date, DAY) + 7, 7) AS STRING)) `date`,
  sku, 
  SUM(sales) sales
FROM `project.dataset.table` t JOIN (
  SELECT sku, MIN(t.date) AS start_date
  FROM `project.dataset.table` t
  GROUP BY sku
) s USING(sku)
GROUP BY sku, `date`

Вы можете протестировать, поиграть с выше, используя примеры данных из вашего вопроса, как в примере ниже

#standardSQL
WITH `project.dataset.table` AS (
  SELECT DATE '2019-02-23' `date`, '123' sku, 20 sales UNION ALL
  SELECT '2019-02-24', '123', 33 UNION ALL
  SELECT '2019-02-25', '123', 45 UNION ALL
  SELECT '2019-02-20', '456', 15 UNION ALL
  SELECT '2019-02-22', '456', 23 
)
SELECT 
  CONCAT('W', CAST(DIV(DATE_DIFF(t.date, start_date, DAY) + 7, 7) AS STRING)) `date`,
  sku, 
  SUM(sales) sales
FROM `project.dataset.table` t JOIN (
  SELECT sku, MIN(t.date) AS start_date
  FROM `project.dataset.table` t
  GROUP BY sku
) s USING(sku)
GROUP BY sku, `date`
-- ORDER BY sku, `date`  

с результатом

Row     date    sku     sales    
1       W1      123     98   
2       W1      456     38   
...