我正在尝试创建一个在状态更改时增加的列。无论状态是否曾经出现,增量都会发生。
| epoch | state | state_idx |
| 1 | open | 1 |
| 2 | open | 1 |
| 3 | closed | 2 |
| 4 | closed | 2 |
| 5 | open | 3 |
| 6 | open | 3 |
| 7 | open | 3 |
我想要state_idx,以便可以按state_idx上的键进行分组。将数据分组后,在Spark群集上处理将更快。
答案 0 :(得分:0)
这是一个群岛问题。对于此版本,我认为lag()
和累加总和是最佳解决方案:
select t.*,
sum(case when prev_state = state then 0 else 1 end) over (order by epoch) as state_idx
from (select t.*, lag(state) over (order by epoch) as prev_state
from t
) t;
lag()
获得先前的状态。 case
根据状态是否更改为标志分配值1或0。 sum() over
计算这种更改的次数。