如何生成一个新列,其值基于一个列的分区,同时还基于另外两个列 (BigQuery) 的值?
How do I produce a new column with values based on a Partition of one column while also based on the values of two additional columns (BigQuery)?
我有一个 table 记录了带有时间戳的作业列表的所有不同状态。因此 ID 列有许多 ID,随着它们的状态变化出现多次,例如下面的 'xyz' 作业经历了几次状态变化。
JobId
Status
Timestamp
xyz
pending
1:00
xyz
reviewed
1:02
xyz
cancelled
1:04
abc
pending
4:30
abc
active
5:30
我想添加一个名为 CurrentStatus 的第 4 列,它将显示每个 ID 的最新状态,所以最后 table 看起来像这样。
JobId
Status
Timestamp
CurrrentStatus
xyz
pending
1:00
cancelled
xyz
reviewed
1:02
cancelled
xyz
cancelled
1:04
cancelled
abc
pending
4:30
active
abc
active
5:30
active
到目前为止,我编写了以下查询来创建一个 LatestTimeStamp 列,该列打印出按每个 Id 分区的最新时间戳。
SELECT *, MAX(Timestamp) OVER(PARTITION BY JobId) AS LatestTimeStamp
FROM `data.sample`
JobId
Status
Timestamp
LatestTimeStamp
xyz
pending
1:00
1:04
xyz
reviewed
1:02
1:04
xyz
cancelled
1:04
1:04
abc
pending
4:30
5:30
abc
active
5:30
5:30
它产生了上面的 table 但现在我如何使用该信息来获取实际状态而不是时间戳?或者是否有更有效的方法来为每个 ID 生成一个包含当前状态的列,可能使用相关查询或 CASE 语句?
我无法找出有效的查询,因此我们将不胜感激。
下面使用
select *,
first_value(Status) over(partition by JobId order by Timestamp desc) as CurrrentStatus
from your_table
如果应用于您问题中的示例数据 - 输出为
我有一个 table 记录了带有时间戳的作业列表的所有不同状态。因此 ID 列有许多 ID,随着它们的状态变化出现多次,例如下面的 'xyz' 作业经历了几次状态变化。
JobId | Status | Timestamp |
---|---|---|
xyz | pending | 1:00 |
xyz | reviewed | 1:02 |
xyz | cancelled | 1:04 |
abc | pending | 4:30 |
abc | active | 5:30 |
我想添加一个名为 CurrentStatus 的第 4 列,它将显示每个 ID 的最新状态,所以最后 table 看起来像这样。
JobId | Status | Timestamp | CurrrentStatus |
---|---|---|---|
xyz | pending | 1:00 | cancelled |
xyz | reviewed | 1:02 | cancelled |
xyz | cancelled | 1:04 | cancelled |
abc | pending | 4:30 | active |
abc | active | 5:30 | active |
到目前为止,我编写了以下查询来创建一个 LatestTimeStamp 列,该列打印出按每个 Id 分区的最新时间戳。
SELECT *, MAX(Timestamp) OVER(PARTITION BY JobId) AS LatestTimeStamp
FROM `data.sample`
JobId | Status | Timestamp | LatestTimeStamp |
---|---|---|---|
xyz | pending | 1:00 | 1:04 |
xyz | reviewed | 1:02 | 1:04 |
xyz | cancelled | 1:04 | 1:04 |
abc | pending | 4:30 | 5:30 |
abc | active | 5:30 | 5:30 |
它产生了上面的 table 但现在我如何使用该信息来获取实际状态而不是时间戳?或者是否有更有效的方法来为每个 ID 生成一个包含当前状态的列,可能使用相关查询或 CASE 语句?
我无法找出有效的查询,因此我们将不胜感激。
下面使用
select *,
first_value(Status) over(partition by JobId order by Timestamp desc) as CurrrentStatus
from your_table
如果应用于您问题中的示例数据 - 输出为