2017-08-17 87 views
1

我们需要计算有多少用户在我们的网站中弹跳。给定一个包含每个浏览量的GUID(用户ID),主机名和路径的表。如果每个主机名只有1个GUID,那么它被认为是反弹。Mysql查询计算跳出率

Table Pageviews: 
- GUID 
- Hostname 
- Path 

我能够做这个查询,但我认为它可能会得到改善。特别是在性能方面。

SELECT 1, (Bounces/All) * 100 AS `Bounce Rate` From (
SELECT 
    count(*) AS All, 
    (
     SELECT count(*) 
     FROM 
     (
      SELECT GUID 
      FROM pageviews 
      GROUP BY GUID 
      HAVING count(GUID) = 1 
     ) 
    ) AS Bounces 
    FROM pageviews 
) 
+0

我认为您的查询不能正确识别反弹。你没有对主机名进行任何操作......同一个GUID不能击中多个主机吗? – AjahnCharles

+0

同样使用count(\ *)会重新计算每个路径上的同一用户一次,如果我访问了50个页面,我仍然是1个非弹跳用户,而不是50个。当然,您希望计数(反弹的用户)并计数(唯一用户)计算每个网站,*然后*总结所有网站并计算您的费率。 – AjahnCharles

回答

2

全球跳出率

组由GUID和主机名的数据(两次,用后者过滤,得到只反弹),然后外部联接在一起:)

SELECT count(bounces.guid) `bounces`, 
     count(uniqueUsers.guid) `total unique users`, 
     count(bounces.guid)/count(uniqueUsers.guid) * 100 `global bounce rate` 
FROM (
    SELECT guid, hostname 
    FROM PageViews 
    GROUP BY guid, hostname 
) uniqueUsers 
LEFT JOIN (
    SELECT guid, hostname 
    FROM PageViews 
    GROUP BY guid, hostname 
    HAVING COUNT(1) = 1 
) bounces 
ON uniqueUsers.guid = bounces.guid 
AND uniqueUsers.hostname = bounces.hostname 

实施例的结果:

bounces unique users global bounce rate 
------- ------------ ------------------ 
3   6    50.0000 

请注意,所有与'host1'对应的4'guid 3'命中仅计为1个唯一用户,但'gui d 1'同时击中了host1和host2,因此它统计了2个唯一用户(我认为这是所需的逻辑)。


每个主机跳出率

相同的,但与一组通过在外部查询:)

SELECT uniqueUsers.hostname, 
     count(bounces.guid) bounces, 
     count(uniqueUsers.guid) `unique users`, 
     count(bounces.guid)/count(uniqueUsers.guid) * 100 `global bounce rate` 
FROM (
    SELECT guid, hostname 
    FROM PageViews 
    GROUP BY guid, hostname 
) uniqueUsers 
LEFT JOIN (
    SELECT guid, hostname 
    FROM PageViews 
    GROUP BY guid, hostname 
    HAVING COUNT(1) = 1 
) bounces 
ON uniqueUsers.guid = bounces.guid 
AND uniqueUsers.hostname = bounces.hostname 
GROUP BY uniqueUsers.hostname; 

实施例的结果:

hostname bounces unique users bounce rate 
-------- ------- ------------ ----------- 
host1  2   4    50.0000 
host2  0   1    0.0000 
host3  1   1    100.0000 

示例数据

guid hostname path 
---- -------- ---- 
1  host1  irrelevant => bounce 1 
2  host1  irrelevant => bounce 2 
3  host1  irrelevant => non-bounce 1 (visit 1/4) 
3  host1  irrelevant 
3  host1  irrelevant 
3  host1  irrelevant 
4  host1  irrelevant => non-bounce 2 (visit 1/2) 
4  host1  irrelevant 
1  host2  irrelevant => non-bounce 3 (visit 1/2) 
1  host2  irrelevant 
2  host3  irrelevant => bounce 3 
+0

真棒。目前GUID不是通过主机共享的,但是您的查询几乎可以提供与Google Analytics(分析)完全相同的跳出率。非常感谢 但是,我可以问你,如何将这个扩展为每个主机名的跳出率? – Mik

+0

完成;我发现了一种使用连接的更简洁的方法。 – AjahnCharles

+0

我建议不要使用JOIN,只需选择主机名,总和(反弹)/计数(1)从(选择案例计数(1)当1然后1其他0结束作为从浏览组反弹从guid,主机名)组主机名 –