Значение приращения SQL при изменении состояния - PullRequest
0 голосов
/ 03 октября 2018

Я пытаюсь создать столбец, который увеличивается при изменении состояния.Приращение может произойти независимо от того, было ли состояние видено ранее.

| 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.Когда данные сгруппированы, они будут быстрее обрабатываться на искровом кластере.

1 Ответ

0 голосов
/ 03 октября 2018

Это проблема групп и островов.Для этой версии, я думаю, 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 подсчитывает количество таких изменений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...