нет простого решения
Нет способа сделать это в одной SQL-статистике.
Ниже приведены две идеи: одна использует цикл для подсчета посещений, другая меняет способ заполнения таблицы visiting
.
петлевое решение
Однако это можно сделать без особых проблем с помощью цикла.
(Я пытался получить правильный синтаксис postgresql, но я не эксперт)
/* find entries where there is no previous entry for */
/* the same visitor within the previous hour: */
select v1.* , 0 visits
into temp_table
from visiting v1
where not exists ( select 1
from visiting v2
where v2.visitor_id = v1.visitor_id
and v2.visit_time < v1.visit_time
and v1.visit_time - interval '1 hour' < v2.visit_time
)
select @rows = @@rowcount
while @rows > 0
begin
update temp_table
set visits = visits + 1 ,
last_time = v.visit_time
from temp_table t ,
visiting v
where t.visitor_id = v.visitor_id
and v.visit_time - interval '1 hour' < t.last_time
and not exists ( select 1
from visiting v2
where v2.visitor_id = t.visitor_id
and v2.visit_time between t.last_time and v.visit_time
)
select @rows = @@rowcount
end
/* get the result: */
select visitor_id,
visits
from temp_table
Идея состоит в том, чтобы сделать это:
- получать все посещения, когда в течение часа нет предварительного посещения.
- это идентифицирует сессии
- цикл, получение следующего посещения для каждого из этих «первых посещений»
- до тех пор, пока не будет больше "следующих посещений"
- теперь вы можете просто считать количество посещений в каждом сеансе.
лучшее решение?
Я предлагаю:
- добавить столбец в таблицу
visiting
: session_id int not null
- изменить процесс, который делает записи, чтобы он проверял, был ли предыдущий визит текущего посетителя менее часа назад. Если это так, он устанавливает
session_id
на то же значение, что и session id
для этого более раннего посещения. Если нет, то генерируется новый session_id
.
- Вы можете включить эту логику в триггер.
Тогда ваш исходный запрос может быть решен с помощью:
SELECT session_id, visitor_id, count(*)
FROM visiting
GROUP BY session_id, visitor_id
Надеюсь, это поможет. Если я допустил ошибки (я уверен, что есть), оставьте комментарий, и я исправлю его.