Как получить еженедельные данные, но начиная с первого числа месяца, и соответственно рассчитать сумму в BQ?

# #sql #date #datetime #google-bigquery #aggregate

Вопрос:

У меня есть проблема с извлечением такого рода данных. Поэтому мне нужно получить еженедельные данные с этими спецификациями:

  1. Сбор данных будет запланирован, следовательно, он займет несколько месяцев
  2. Самая первая неделя начнется с первого числа (1 в каждом месяце) — Зеленый на рисунке
  3. Последняя неделя не включает даты следующего месяца-красным на рисунке

Исходные данные и желаемые выходные данные будут более или менее выглядеть следующим образом: введите описание изображения здесь

Есть ли какой-либо обходной путь, чтобы сделать это в BigQuery? Спасибо (прилагается ниже данных)

  ------------- -------  | date | sales |  ------------- -------  | 1 Oct 2021 | 5 |  ------------- -------  | 2 Oct 2021 | 13 |  ------------- -------  | 3 Oct 2021 | 75 |  ------------- -------  | 4 Oct 2021 | 3 |  ------------- -------  | 5 Oct 2021 | 70 |  ------------- -------  | 6 Oct 2021 | 85 |  ------------- -------  | 7 Oct 2021 | 99 |  ------------- -------  | 8 Oct 2021 | 90 |  ------------- -------  | 9 Oct 2021 | 68 |  ------------- -------  | 10 Oct 2021 | 97 |  ------------- -------  | 11 Oct 2021 | 87 |  ------------- -------  | 12 Oct 2021 | 56 |  ------------- -------  | 13 Oct 2021 | 99 |  ------------- -------  | 14 Oct 2021 | 38 |  ------------- -------  | 15 Oct 2021 | 6 |  ------------- -------  | 16 Oct 2021 | 43 |  ------------- -------  | 17 Oct 2021 | 45 |  ------------- -------  | 18 Oct 2021 | 90 |  ------------- -------  | 19 Oct 2021 | 64 |  ------------- -------  | 20 Oct 2021 | 26 |  ------------- -------  | 21 Oct 2021 | 24 |  ------------- -------  | 22 Oct 2021 | 4 |  ------------- -------  | 23 Oct 2021 | 36 |  ------------- -------  | 24 Oct 2021 | 68 |  ------------- -------  | 25 Oct 2021 | 4 |  ------------- -------  | 26 Oct 2021 | 16 |  ------------- -------  | 27 Oct 2021 | 30 |  ------------- -------  | 28 Oct 2021 | 89 |  ------------- -------  | 29 Oct 2021 | 46 |  ------------- -------  | 30 Oct 2021 | 28 |  ------------- -------  | 31 Oct 2021 | 28 |  ------------- -------  | 1 Nov 2021 | 47 |  ------------- -------  | 2 Nov 2021 | 75 |  ------------- -------  | 3 Nov 2021 | 1 |  ------------- -------  | 4 Nov 2021 | 26 |  ------------- -------  | 5 Nov 2021 | 26 |  ------------- -------  | 6 Nov 2021 | 38 |  ------------- -------  | 7 Nov 2021 | 79 |  ------------- -------  | 8 Nov 2021 | 37 |  ------------- -------  | 9 Nov 2021 | 83 |  ------------- -------  | 10 Nov 2021 | 97 |  ------------- -------  | 11 Nov 2021 | 56 |  ------------- -------  | 12 Nov 2021 | 83 |  ------------- -------  | 13 Nov 2021 | 14 |  ------------- -------  | 14 Nov 2021 | 25 |  ------------- -------  | 15 Nov 2021 | 55 |  ------------- -------  | 16 Nov 2021 | 16 |  ------------- -------  | 17 Nov 2021 | 80 |  ------------- -------  | 18 Nov 2021 | 66 |  ------------- -------  | 19 Nov 2021 | 25 |  ------------- -------  | 20 Nov 2021 | 62 |  ------------- -------  | 21 Nov 2021 | 36 |  ------------- -------  | 22 Nov 2021 | 33 |  ------------- -------  | 23 Nov 2021 | 19 |  ------------- -------  | 24 Nov 2021 | 47 |  ------------- -------  | 25 Nov 2021 | 14 |  ------------- -------  | 26 Nov 2021 | 22 |  ------------- -------  | 27 Nov 2021 | 66 |  ------------- -------  | 28 Nov 2021 | 15 |  ------------- -------  | 29 Nov 2021 | 96 |  ------------- -------  | 30 Nov 2021 | 4 |  ------------- -------   

Комментарии:

1. пожалуйста, предоставьте примеры данных в виде текста, чтобы мы действительно могли вам помочь!

2. Привет @MikhailBerlyant, только что добавил данные в вопрос, спасибо

Ответ №1:

Рассмотрим следующий подход

 with temp as (  select parse_date('%d %B %Y', date) date, sales  from your_table ) select format_date('%d %B %Y', weeks[ordinal(num)]) start_week, sum(sales) total_sales  from (  select sales, weeks, range_bucket(date, weeks) num  from temp, unnest([struct(generate_date_array(date_trunc(date, month), last_day(date, month), interval 7 day ) as weeks)]) ) group by start_week   

если применить к образцам данных (как есть) в вашем вопросе — вывод будет

введите описание изображения здесь