Sql 基于另一列以前的值填充一列

Sql 基于另一列以前的值填充一列,sql,google-bigquery,window-functions,gaps-and-islands,Sql,Google Bigquery,Window Functions,Gaps And Islands,我试图创建一个列,该列填充每一行的事务ID,直到该事务完成的行为止——在本例中,订单之前的每个“添加到篮子”事件 到目前为止,我已尝试使用第一个\u值: SELECT UserID, date, session_id, hitnumber, add_to_basket, transactionid, first_value(transactionid) over (partition by trans_part order by date, transactionid) AS t_id FR

我试图创建一个列,该列填充每一行的事务ID,直到该事务完成的行为止——在本例中,订单之前的每个“添加到篮子”事件

到目前为止,我已尝试使用
第一个\u值

SELECT 
UserID, date, session_id, hitnumber, add_to_basket, transactionid, 
first_value(transactionid) over (partition by trans_part order by date, transactionid) AS t_id
FROM(
  select UserID, date, session_id, hitnumber, add_to_basket, transactionid, 
  SUM(CASE WHEN transactionid IS NULL THEN 0 ELSE 1 END) OVER (ORDER BY date, transactionid) AS trans_part,
  FIRST_VALUE(transactionid IGNORE NULLS) 
OVER (PARTITION BY userid ORDER BY hitnumber ASC ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS t_id,
  from q1
  join q2 using (session_id)
  order by 1,2,3,4
)
但是,我得到的结果与我想要的相反,根据此事务之后发生的篮子事件填充上一个订单的事务ID

如何更改代码,以便在导致该订单的篮子事件之后看到该订单的交易id?例如,在下表中,我希望看到
t\u id
列的事务id以…095结尾,而不是以…383结尾

根据Gordon下面的回答,我也尝试过:

last_value(transactionid ignore nulls) over(
  order by hitnumber 
  rows between unbounded preceding and current row) as t_id2,
但这并不是用事务id(如下所示为
t_id2
)填充执行事务的事件行:

您可以使用
最后一个值(忽略空值)

与您的答案不同的是windowing子句,它在当前行结束

编辑:

每个
session\u id
似乎有一个
t\u id
,所以只需使用
max()


谢谢Gordon,我已经尝试过了,但是仍然没有得到我想要的结果,我已经更新了我的问题,以显示这个更新的查询的结果。
select . . . ,
       last_value(transaction_id ignore nulls) over (
           order by hitnumber
           rows between unbounded preceding and current row
          ) as t_id
from q1 join
     q2 using (session_id);
select . . . ,
       max(transaction_id) over (partition by session_id) as t_id
from q1 join
     q2 using (session_id);