Как сделать разбиение по некоторому диапазону значений в оконной функции

#sql #apache-spark #apache-spark-sql

Вопрос:

У меня есть таблица, например:

Стол log :

 userId | action |           time       |
---------------------------------------|
  1    |    1   |   2020-11-27 05:48:02|
---------------------------------------|
  1    |    2   |   2020-11-27 05:49:02|
---------------------------------------|
  1    |    3   |   2020-11-27 05:50:02|
---------------------------------------|
  1    |    1   |   2020-11-27 06:49:02|
---------------------------------------|
  1    |    2   |   2020-11-27 06:50:02|
---------------------------------------|
  1    |    3   |   2020-11-27 05:51:02|
---------------------------------------|
  2    |    1   |   2020-11-27 05:49:02|
---------------------------------------|
  2    |    2   |   2020-11-27 05:50:02|
---------------------------------------|
  2    |    3   |   2020-11-27 05:51:02|
---------------------------------------
 

действие 1 — отмечает, что сеанс запущен

действие 3 — отмечает, что сеанс завершен

Как я могу добавить столбец и установить идентификатор сеанса для каждого сеанса? Целевая таблица должна иметь такое представление:

 userId | action |           time       | sessionId |
---------------------------------------------------|
  1    |    1   |   2020-11-27 05:48:02| SessionId1|
---------------------------------------------------|
  1    |    2   |   2020-11-27 05:49:02| SessionId1|
---------------------------------------------------|
  1    |    3   |   2020-11-27 05:50:02| SessionId1|
---------------------------------------------------|
  1    |    1   |   2020-11-27 06:49:02| SessionId2|
---------------------------------------------------|
  1    |    2   |   2020-11-27 06:50:02| SessionId2|
---------------------------------------------------|
  1    |    3   |   2020-11-27 05:51:02| SessionId2|
---------------------------------------------------|
  2    |    1   |   2020-11-27 05:49:02| SessionId3|
---------------------------------------------------|
  2    |    2   |   2020-11-27 05:50:02| SessionId3|
---------------------------------------------------|
  2    |    3   |   2020-11-27 05:51:02| SessionId3|
---------------------------------------------------
 

Комментарии:

1. Я удалил конфликтующие теги здесь; пожалуйста, используйте только теги, связанные с вопросом и технологией, которую вы используете. Вам нужно будет перенастроить свои УОКР.

2. Извините за это @Larnu

Ответ №1:

Вы можете просто сделать совокупную сумму «1», я думаю:

 select t.*,
       sum(case when action = 1 then 1 else 0 end) over (order by userid,time) as sessionid
from t