Сложный вариант группировки — использование «разделяющего флага tinyint» между группами

#sql #postgresql

#sql #postgresql

Вопрос:

Ниже приведен пример рассматриваемого набора данных для просмотра страниц.

Представленные записи отсортированы в порядке возрастания по временной метке.

введите описание изображения здесь

Мне нужно вычислить некоторые показатели для каждого сеанса из набора данных.

Проблема в том, что нет четкого идентификатора для сеанса. Единственное, что доступно, — это is_a_new_session флаг, который служит своего рода разделителем между сеансами. Итак, в данном примере существует 5 отдельных сеансов.

Как я мог бы сгенерировать какой-то идентификатор сеанса и добавить его в набор данных, чтобы позже я мог использовать его для группировки по сеансам?

Желаемый новый столбец должен быть похож на этот: введите описание изображения здесь

Ответ №1:

Используйте совокупную сумму для определения групп, а затем агрегируйте:

 select min(timestamp), max(timestamp), . . .   -- whatever columns you want
from (select t.*,
             sum(is_a_new_session) over (order by timestamp) as grp
      from t
     ) t
group by grp;
  

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

1. Это было так просто.. Смущен тем, что сам этого не видел. Спасибо, Гордон!