根据另一列的先前值填充一列

Posted

技术标签:

【中文标题】根据另一列的先前值填充一列【英文标题】:Populate one column based on the previous values of another 【发布时间】:2020-04-02 10:40:48 【问题描述】:

我正在尝试创建一个列,该列填充每一行的交易 ID,直到该交易完成的行 - 在本例中,订单之前的每个“添加到购物篮”事件。

到目前为止,我已经尝试过使用FIRST_VALUE

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?例如,在下表中,我想查看以 ...095 结尾的事务 ID,而不是 t_id 列的以 ...383 结尾的 id。

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

last_value(transactionid ignore nulls) over(
  order by hitnumber 
  rows between unbounded preceding and current row) as t_id2,

但这不会填充使用事务 id 进行事务的事件行(见下文 t_id2):

【问题讨论】:

【参考方案1】:

你可以使用last_value(ignore nulls):

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);

与您的答案不同的是在当前行结束的窗口子句。

编辑:

似乎每个session_id 都有一个t_id,所以只需使用max()

select . . . ,
       max(transaction_id) over (partition by session_id) as t_id
from q1 join
     q2 using (session_id);

【讨论】:

谢谢 Gordon,我已经尝试过了,但仍然没有得到我想要的输出,我已经更新了我的问题以显示这个更新后的查询的结果。

以上是关于根据另一列的先前值填充一列的主要内容,如果未能解决你的问题,请参考以下文章

Scala Spark Dataframe 创建一个新列,其中包含另一列的最大先前值和当前值

如何根据另一列的聚合得到一列的对应值?

根据另一列唯一值填充另一列

根据不同数据类型的另一列设置一列的默认值

如何根据另一列的值获取单行值?

根据另一列的值选择列