MySQL查询以查找每周唯一的新访客数

MySQL查询以查找每周唯一的新访客数,mysql,sql,Mysql,Sql,我在MySQL中有3个表: 1页id,标题 2访客id、姓名 3页面访问页面id、访客id、访问时间戳 访问者可以在几天内多次访问页面。因此,虽然一个页面有一行,一个访问者有一行,但我们可以有几个页面访问行,每个行都有访问的时间戳 我正在努力找到每周的独特访客数量。我知道如何获取非uniques的“按周计数”查询,即“我每周看到多少访客”。不过,我不知道如何按周挑选独特的访客,因为访客只是第一次出现在名单上 ----------- ----------- --------------

我在MySQL中有3个表: 1页id,标题 2访客id、姓名 3页面访问页面id、访客id、访问时间戳

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

我正在努力找到每周的独特访客数量。我知道如何获取非uniques的“按周计数”查询,即“我每周看到多少访客”。不过,我不知道如何按周挑选独特的访客,因为访客只是第一次出现在名单上

-----------    -----------    ----------------------------
| 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       | 
如前所述,我可以计算出如何按周显示所有访客。我不知道如何才能得到独一无二的访客

我试着做一个mintimestamp的访问,但是,根据我尝试的地方,它返回了所有行中最低的时间戳,这是可以理解的


任何帮助都将不胜感激

当你第一次遇到这个问题时,这是一个棘手的问题。它需要两个级别的聚合。第一个是每个访问者的第一次访问,第二个是按时间进行总结。以下是每日总结:

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);

翻译成“周”总是有点棘手——它们是从周一开始的吗?周六结束?星期五?这些我都看过了。但是,上面的内容是累加的,因此您可以只添加给定周的所有值来获得您的值。

如果您不想在没有子查询的情况下执行此操作:

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>

正如Gordon提到的,如何确定一周可能很棘手。在你看到的地方加上计算。就个人而言,我喜欢使用日历表来实现这种功能,但这取决于您。您可以直接对PV.visit\u date运行任何表达式以确定它。

谢谢!!!这是非常有帮助的,我得到了工作的基础上,这!我一直想弄清楚如何排列元素,以便运行计数函数。对于“周”计算,我使用了以下格式:DATE_FORMATDATE_ADDv.minvd,INTERVAL1-DAYOFWEEKv.minvd DAY,“%Y-%m-%d”作为“周”,最后,“GROUP BY YEARWEEKv.minvd”我的MySQL引擎默认在周日开始一周。谢谢你,林诺夫先生!