MySQL查询每周查找唯一新访问者的数量

时间:2016-02-26 19:50:32

标签: mysql sql

我在MySQL中有3个表: 1)页面(标识,标题) 2)访客(身份证,姓名) 3)page_visit(page_id,visitor_id,timestamp_of_visit)

访问者可以在几天内多次访问网页。因此,虽然我们将有一行用于页面,而一行用于访问者,但我们可以有几个page_visit行,每行都有一个访问时间戳。

我试图按周找到唯一身份访问者的数量。我知道如何按周计算'查询非独特的(即每周我看到多少访问者')。我不确定如何在一周之内选择唯一访问者,但访问者只有在第一次见到时才会出现在列表中。

-----------    -----------    ----------------------------
| page    |    | visitor |    | page_visit               |
-----------    -----------    ----------------------------
|id |title|    |id |name |    |pid|vid|timestamp of visit|
-----------    -----------    ----------------------------
| 1 | p1  |    | 1 | v1  |    | 1 | 1 | 02-18-2016:08:30 |
| 2 | p2  |    | 2 | v2  |    | 1 | 1 | 02-18-2016:10:00 |
| 3 | p3  |    | 3 | v3  |    | 1 | 3 | 02-20-2016:23:45 |
| 4 | p4  |    | 4 | v4  |    | 2 | 3 | 02-22-2016:07:30 |
| 5 | p5  |    | 5 | v5  |    | 3 | 1 | 02-23-2016:08:30 |
| 6 | p6  |    | 6 | v6  |    | 3 | 6 | 02-24-2016:09:30 |

结果集应显示的内容:

------------------------
| results              |
------------------------
| Week of    | Net new |
------------------------
| 02-15-2016 | 2       |
| 02-22-2016 | 1       | 

如上所述,我可以弄清楚如何按周显示所有访客。我不确定如何吸引独特的访客。

我尝试了一个min(访问的时间戳),但是,根据我尝试的地方,它返回了所有行的最低时间戳(可以理解......)。

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:4)

当你第一次遇到它时,这是一个棘手的问题。它需要两个级别的聚合。第一次访问是第一次访问,第二次是按时间​​总结。以下是白天的摘要:

select date(minvd), count(*) as numvisitors
from (select vid, min(visitdate) as minvd
      from page_visit pv
      group by vid
     ) v
group by date(minvd)
order by date(minvd);

翻译几周总是有点棘手 - 他们是星期一开始的吗?周六结束?在周五? (我已经看过所有这些。)但是,上面是附加的,所以你可以添加给定周的所有值来获得你的价值。

答案 1 :(得分:2)

如果你想在没有子查询的情况下这样做:

SELECT
    <week>,
    COUNT(DISTINCT PV.vid)
FROM
    Page_Visit PV
LEFT OUTER JOIN Page_Visit PV2 ON
    PV2.vid = PV.vid AND
    PV2.visit_date < PV.visit_date
WHERE
    PV2.vid IS NULL
GROUP BY
    <week>

正如戈登所提到的,你如何确定一周可能会很棘手。只需在您看到<week>的位置添加该计算即可。就个人而言,我喜欢使用Calendar表来实现这种功能,但这取决于您。您可以直接针对PV.visit_date运行任何表达式来确定它。