【问题标题】:Fill table using last value per user使用每个用户的最后一个值填充表
【发布时间】:2021-11-18 18:13:15
【问题描述】:

我每天都有客户余额数据,BigQuery 中的结构如下:

CREATE TABLE if not EXISTS balance (
  user_id int,
  updated_ag DATE,
  value float
);

INSERT INTO balance VALUES
(1, '2021-01-01', 0),
(1, '2021-01-02', 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);

如果当天的余额发生变化,我会在某一天为用户保留一行。

我想通过将最后一天的余额放在有更新的地方来完成每个用户的数据,日期介于有余额的第一天和表中的最后日期之间。

因此,此示例中的输出表将具有以下值:

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

在 BigQuery 中执行此操作的最简单方法是什么?

【问题讨论】:

    标签: sql google-bigquery


    【解决方案1】:

    试试这个:

    select user_id, generated_date, value
    from (
      select 
        *, 
        ifnull(lead(date) over(partition by user_id order by date) - 1, max(date) over()) date_to
      from balance
    ), unnest(generate_date_array(date, date_to, interval 1 day)) generated_date
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-09
      • 1970-01-01
      • 1970-01-01
      • 2015-07-22
      • 2021-08-03
      • 2021-05-07
      • 2021-04-20
      • 1970-01-01
      相关资源
      最近更新 更多