# #sql #date #datetime #google-bigquery #aggregate
Вопрос:
У меня есть проблема с извлечением такого рода данных. Поэтому мне нужно получить еженедельные данные с этими спецификациями:
- Сбор данных будет запланирован, следовательно, он займет несколько месяцев
- Самая первая неделя начнется с первого числа (1 в каждом месяце) — Зеленый на рисунке
- Последняя неделя не включает даты следующего месяца-красным на рисунке
Исходные данные и желаемые выходные данные будут более или менее выглядеть следующим образом:
Есть ли какой-либо обходной путь, чтобы сделать это в 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
если применить к образцам данных (как есть) в вашем вопросе — вывод будет