Заполнение значений пользователем в BigQuery

# #sql #google-bigquery

Вопрос:

У меня есть данные о том, как набор клиентов ежедневно тратит деньги, со следующей структурой в BigQuery:

 CREATE TABLE if not EXISTS daily_spend (
  user_id int,
  created_at DATE,
  value float
);

INSERT INTO daily_spend VALUES
(1, '2021-01-01', 0),
(1, '2021-01-02', 1),
(1, '2021-01-04', 1),
(1, '2021-01-05', 2),
(1, '2021-01-07', 5),
(2, '2021-01-01', 5),
(2, '2021-01-03', 0),
(2, '2021-01-04', 1),
(2, '2021-01-06', 2);
 

Я хотел бы заполнить данные для каждого пользователя, поставив 0 в дни, когда пользователи не тратили никаких денег, включая только дни между их первым и последним днями, когда они тратили деньги.

Таким образом, выходная таблица в этом примере будет иметь следующие значения:

 (1, '2021-01-01', 0),
(1, '2021-01-02', 1),
(1, '2021-01-03', 0),
(1, '2021-01-04', 1),
(1, '2021-01-05', 2),
(1, '2021-01-06', 0),
(1, '2021-01-07', 5),
(2, '2021-01-01', 5),
(2, '2021-01-02', 0),
(2, '2021-01-03', 0),
(2, '2021-01-04', 1),
(2, '2021-01-05', 0),
(2, '2021-01-06', 2)
 

Каков самый простой способ сделать это в BigQuery?

Ответ №1:

Используйте ниже

 select user_id, created_at, ifnull(value, 0) value
from (
  select user_id, min(created_at) min_date, max(created_at) max_date
  from daily_spend
  group by user_id
), unnest(generate_date_array(min_date, max_date)) created_at
left join daily_spend
using(user_id, created_at)         
 

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

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