【发布时间】:2021-11-06 02:21:04
【问题描述】:
我得到了“类型”和“前一行”文件,并试图生成“连续值”文件
我尝试使用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 |
我该如何解决这个问题?
【问题讨论】:
我得到了“类型”和“前一行”文件,并试图生成“连续值”文件
我尝试使用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
如果应用于样本数据 - 输出是
【讨论】: