GROUP BY каждые "n" записей (сохранение идентификатора первой записи) - PullRequest
0 голосов
/ 24 февраля 2019

У меня есть большая база данных с такой информацией:

date         sku    sales
2019-02-13   123    10
2019-02-14   123    10
2019-02-15   123    10
2019-02-16   123    10
2019-02-17   123    10
2019-02-18   123    10
2019-02-19   123    10
2019-02-20   123    10
2019-02-21   456    10
2019-02-22   456    10

Я хотел бы запрашивать таблицу, но с GROUP BY каждые 7 дней, поэтому я бы получил:

begin_date   sku    sales  week
2019-02-13   123    70     1     
2019-02-20   123    10     2     
2019-02-21   456    20     1

Так что я группирую по 7 записей для каждого SKU и сохраняю первую дату для каждого SKU.Одна важная проблема заключается в том, что в реальной таблице нет записей, отсортированных по дате или по sku

Thx!

Ответы [ 2 ]

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

Ниже для BigQuery Standard SQL (и на самом деле работает ...)

#standardSQL
WITH skus AS (
  SELECT sku, MIN(dt) AS start_date
  FROM `project.dataset.table`
  GROUP BY sku
) 
SELECT 
  MIN(dt) begin_date, 
  sku, 
  SUM(sales) sales, 
  DIV(DATE_DIFF(dt, start_date, DAY) + 7, 7) week
FROM `project.dataset.table` t
JOIN skus s USING(sku)
GROUP BY sku, week

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

#standardSQL
WITH `project.dataset.table` AS (
  SELECT DATE '2019-02-13' dt, '123' sku, 10 sales UNION ALL
  SELECT '2019-02-14', '123', 10 UNION ALL
  SELECT '2019-02-15', '123', 10 UNION ALL
  SELECT '2019-02-16', '123', 10 UNION ALL
  SELECT '2019-02-17', '123', 10 UNION ALL
  SELECT '2019-02-18', '123', 10 UNION ALL
  SELECT '2019-02-19', '123', 10 UNION ALL
  SELECT '2019-02-20', '123', 10 UNION ALL
  SELECT '2019-02-21', '456', 10 UNION ALL
  SELECT '2019-02-22', '456', 10 
), skus AS (
  SELECT sku, MIN(dt) AS start_date
  FROM `project.dataset.table`
  GROUP BY sku
) 
SELECT 
  MIN(dt) begin_date, 
  sku, 
  SUM(sales) sales, 
  DIV(DATE_DIFF(dt, start_date, DAY) + 7, 7) week
FROM `project.dataset.table` t
JOIN skus s USING(sku)
GROUP BY sku, week
-- ORDER BY sku, week   

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

Row begin_date  sku sales   week     
1   2019-02-13  123 70      1    
2   2019-02-20  123 10      2    
3   2019-02-21  456 20      1     
0 голосов
/ 24 февраля 2019

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

select date_add(mindate, interval floor(date_diff(date, mindate, day) / 7) * 7 day) as week_start
       sku, sum(sales) as sales,
       1 + floor(date_diff(date, mindate, day) / 7) as weeks
from (select t.*, min(date) over (partition by sku) as mindate
      from t
     ) t
group by weeks, week_start;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...