【问题标题】:GROUP BY DAY(FROM_UNIXTIME) unexpectedly changes countGROUP BY DAY(FROM_UNIXTIME) 意外更改计数
【发布时间】:2013-06-20 16:44:26
【问题描述】:

我将各个网站访问的会话 ID、IP 地址和时间戳以及所有相关的综合浏览量存储在数据库中。它包含更多数据,但此处相关的数据是通过此查询提取的:

SELECT 
Pageviews.id, Visitors.time, Visitors.session, Visitors.ip
FROM Visitors
INNER JOIN Pageviews
    ON Visitors.session=Pageviews.session
ORDER BY Visitors.time ASC

结果如下:

id      time        session                     ip

1048    1371473496  nhie5sh2tiufs2ufupcremc6c2  x88.xxx.xxx.xxx
1050    1371474103  8hfphqvq5ri6muc84oidp7q195  x6x.xxx.xxx.xxx
1062    1371474956  hhgssr4v26pjbilkg8d81olqj7  xxx.x3x.xxx.xxx
1066    1371476339  ic8iqd0a4mpoelni15n4tq3404  x1x.xxx.xxx.xxx
1067    1371476629  ockivrm61upk7ss5ni4n8muv23  x2x.xxx.xxx.xxx
1070    1371477856  5tdj9rrd1qsvafovufnkgh8r26  xxx.xxx.x7x.xxx
1068    1371477856  5tdj9rrd1qsvafovufnkgh8r26  xxx.xxx.xxx.x2x
1069    1371478229  5e82v29nuf2k46ir13i21msps5  xxx.x5x.xxx.x8x

为了获取访问者(不同的 IP)、访问量(不同的会话)和浏览量(不同的浏览量 ID)的总数,我查询数据库如下:

SELECT 
 count(distinct(Visitors.ip)) as 'Visitors',
 count(distinct(Visitors.session)) as 'Visits',
 count(Pageviews.id) as 'Pageviews'
FROM Visitors
INNER JOIN Pageviews
 ON Visitors.session=Pageviews.session

返回如下内容:

Visitors   Visits    Pageviews

211        244       412

但是,我想使用存储的时间戳按年、月和日对这些总数进行分组。为了获取这些数据,我编写了以下查询:

SELECT 
 DAY(FROM_UNIXTIME(Visitors.time)) as 'Day',
 MONTH(FROM_UNIXTIME(Visitors.time)) as 'Month',
 YEAR(FROM_UNIXTIME(Visitors.time)) as 'Year',
 count(distinct(Visitors.ip)) as 'Visitors',
 count(distinct(Visitors.session)) as 'Visits',
 count(Pageviews.id) as 'Pageviews'
FROM Visitors
INNER JOIN Pageviews
 ON Visitors.session=Pageviews.session
GROUP BY Year, Month, Day
ORDER BY Year, Month, Day DESC

这很有效,因为日期、浏览量和访问量都是正确的:

Day Month   Year    Visitors    Visits  Pageviews

20  6       2013    40          43      59
19  6       2013    80          90      112
18  6       2013    62          66      173
17  6       2013    43          45      68

如您所见,此处的综合浏览量加起来为 412,访问量为 244。然而,让我彻夜难眠的是,访问者数加起来不等于 211,因为它应该,但改为 225。我不明白为什么这只发生在访问者人数上。

很抱歉这个冗长的问题。任何想法将不胜感激。

【问题讨论】:

  • 附注:distinct 不是一个函数。写distinct(foo)distinct foo 相同。括号完全没用,并且经常暗示(尤其是在与多列一起使用时)distinct 的行为被误解了。
  • 很高兴知道,谢谢。

标签: mysql sql


【解决方案1】:

由于您计算的是 DISTINCT IP,因此当您按月 GROUP BY 时,每个分组(月)都会获得 DISTINCT IP 的计数,即,如果人们在多个月内访问,则可以多次计算。

例如:12.123.456.78 访问量在 3 月和 4 月,即每个月统计一个 Distinct IP,但如果不按月分组,则只有 1 个不同 IP,不能简单地将分组 COUNT(DISTINCT) 的结果相加获取未分组时的总 COUNT(DISTINCT)。

此功能可能会有所帮助,因为它可以揭示重复访问者与新访问者的区别。

【讨论】:

  • 啊,当然!进一步阅读,这显然被称为“酒店问题”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-22
  • 2018-12-18
  • 1970-01-01
相关资源
最近更新 更多