BigQuery SQL:从日志表创建每日当前状态表

BigQuery SQL:从日志表创建每日当前状态表,sql,google-bigquery,Sql,Google Bigquery,我有一个记录状态变化的日志表。 例如: Updated_at Customer Status 01/01/2020 A Trial 01/01/2020 C Trial 05/01/2020 B Trial 06/03/2020 C Free 15/03/2020 B Full 05/04/2020 A Free 07/05/2020 C Full

我有一个记录状态变化的日志表。 例如:

Updated_at  Customer    Status
01/01/2020     A       Trial
01/01/2020     C       Trial
05/01/2020     B       Trial
06/03/2020     C       Free
15/03/2020     B       Full
05/04/2020     A       Free
07/05/2020     C       Full
10/09/2020     A       Full
10/09/2020     C       Remove
**更新的时间戳为

我需要制作每日状态表,在该表中我可以按天查看客户的当前状态:

Date         Customer   Status
01/01/2020      A   Trial
01/01/2020      C   Trial
02/01/2020      A   Trial
02/01/2020      C   Trial
|       
|       
05/01/2020      A   Trial
05/01/2020      B   Trial
05/01/2020      C   Trial
|
|       
06/03/2020      A   Trial
06/03/2020      B   Trial
06/03/2020      C   Free
|       
|       
15/03/2020      A   Trial
15/03/2020      B   Full
15/03/2020      C   Free
|       
|   
10/09/2020     A    Full
10/09/2020     B    Full
10/09/2020     C    Remove
也就是说,如果当天的状态没有变化,则从日志表中的最后一个更改日期开始记录状态

我的尝试:

首先,我创建了一个包含日期序列的列

接下来,我需要加入一个带有日期的日志表

WITH CTE_DATES AS
(
SELECT
  *
FROM
  UNNEST( GENERATE_DATE_ARRAY( CURRENT_DATE(), DATE('2019-05-30'), INTERVAL -1 DAY) )  as Date
)
SELECT  d.date,
lt.Customer,
lt.Status,
extract (date from updated_at) as LT_Date
FROM `logTable` lt join CTE_DATES d on  extract (date from updated_at)<=d.Date

连接表以获取每个日期序列中的最后一条记录的正确方法是什么?

我强烈建议通过创建每行的日期来实现这一点。这使得将数据放入所需的行变得简单。它也比一次生成所有日期,然后使用联接和其他机制生成数据要高效得多:

with lt as (
      select lt.*,
             lead(updated_at, 1, current_date) over (partition by customer order by updated_at) as next_updated_at
      from `logTable` lt
     )
select dte, lt.customer, lt.status
from lt cross join
     unnest(generate_date_array(lt.updated_at,
                                date_add(lt.next_updated_at, interval -1 day),
                                interval 1 day)
                               ) dte;

我强烈建议通过创建每行的日期来实现这一点。这使得将数据放入所需的行变得简单。它也比一次生成所有日期,然后使用联接和其他机制生成数据要高效得多:

with lt as (
      select lt.*,
             lead(updated_at, 1, current_date) over (partition by customer order by updated_at) as next_updated_at
      from `logTable` lt
     )
select dte, lt.customer, lt.status
from lt cross join
     unnest(generate_date_array(lt.updated_at,
                                date_add(lt.next_updated_at, interval -1 day),
                                interval 1 day)
                               ) dte;

可能
date\u add(lt.next\u updated\u at,interval-1天)
的意思是…嗨,通过这种方法,我得到的最后一天和昨天一样,而不是昨天today@SergeyGeron . . . 谢谢。可能是
date\u add(lt.next\u updated\u at,interval-1天)
的意思是…嗨,通过这种方法,我得到了昨天一样的最后一天,而不是今天today@SergeyGeron . . . 非常感谢。