连续值bigquery
Consecutive values bigquery
我得到了“类型”和“前一行”字段并尝试生成“连续值”字段
我尝试使用 count () over (partition by type , previouse row )
但在“上一行”更改后该值不会重置
type
previous row
Consecutive values
X
1
2
X
1
1
X
0
3
X
0
2
X
0
1
X
1
2
X
1
1
我该如何解决这个问题?
为了实现您的目标 - 您需要了解如何对行进行排序。通常是某种日期或时间戳或任何其他允许订购的方式。因此,假设您有一个名为 ts 的额外列可用,它定义了该顺序 - 如下例所示
所以在这种情况下请考虑以下解决方案
select * except(change, grp),
count(1) over(partition by type, grp order by ts desc) Consecutive_values
from (
select *, countif(change) over(partition by type order by ts) grp
from (
select *,
ifnull(value != lag(value) over(partition by type order by ts), true) change
from data
)
)
# order by ts
如果应用于示例数据 - 输出为
我得到了“类型”和“前一行”字段并尝试生成“连续值”字段
我尝试使用 count () over (partition by type , previouse row )
但在“上一行”更改后该值不会重置
type | previous row | Consecutive values |
---|---|---|
X | 1 | 2 |
X | 1 | 1 |
X | 0 | 3 |
X | 0 | 2 |
X | 0 | 1 |
X | 1 | 2 |
X | 1 | 1 |
我该如何解决这个问题?
为了实现您的目标 - 您需要了解如何对行进行排序。通常是某种日期或时间戳或任何其他允许订购的方式。因此,假设您有一个名为 ts 的额外列可用,它定义了该顺序 - 如下例所示
所以在这种情况下请考虑以下解决方案
select * except(change, grp),
count(1) over(partition by type, grp order by ts desc) Consecutive_values
from (
select *, countif(change) over(partition by type order by ts) grp
from (
select *,
ifnull(value != lag(value) over(partition by type order by ts), true) change
from data
)
)
# order by ts
如果应用于示例数据 - 输出为