状态更改时的SQL增量值

时间:2018-10-03 18:42:46

标签: sql pyspark apache-spark-sql

我正在尝试创建一个在状态更改时增加的列。无论状态是否曾经出现,增量都会发生。

| 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群集上处理将更快。

1 个答案:

答案 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计算这种更改的次数。