há uma solução simples
Não há nenhuma maneira de fazer isso em um único statment SQL.
Abaixo estão 2 idéias: um usa um loop para contar visitas, o outro muda a forma como a visitingtabela é preenchida.
solução circuito
No entanto, isso pode ser feito sem muita dificuldade com um loop.
(Eu tentei obter a sintaxe PostgreSQL correta, mas eu não sou nenhum perito)
/* 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
A idéia aqui é fazer isso:
- obter todas as visitas em que não há visita anterior dentro de uma hora.
- este identifica as sessões
- loop, recebendo a próxima visita para cada um desses "primeiras visitas"
- até que não haja mais "próximas visitas"
- Agora você pode apenas ler o número de visitas em cada sessão.
melhor solução?
Eu sugiro:
- adicionar uma coluna à
visitingtabela:session_id int not null
- alterar o processo que faz com que as entradas para que ele verifica para ver se a visita anterior pelo visitante atual foi inferior a uma hora atrás. Se assim for, ele define
session_id para o mesmo que o session id para que a visita anterior. Se não, ele gera um novo session_id .
- você poderia colocar esta lógica em um gatilho.
Em seguida, sua consulta original pode ser resolvido por:
SELECT session_id, visitor_id, count(*)
FROM visiting
GROUP BY session_id, visitor_id
Espero que isto ajude. Se eu cometi erros (eu tenho certeza que eu tenho), deixe um comentário e eu vou corrigi-lo.