【问题标题】:With a table of visitor data, how do I get hourly totals of total and unique visitors?使用访问者数据表,我如何获得总访问者和唯一访问者的每小时总数?
【发布时间】:2023-03-06 15:22:01
【问题描述】:

我有一个访问表,结构如下:

+--------------------------------------+
| ID | Date       | Time     | Session |
+--------------------------------------+
| 1  | 05-18-2014 | 20:15:10 | 1       |
| 2  | 05-18-2014 | 20:15:20 | 1       |
| 3  | 05-18-2014 | 21:40:20 | 2       |
| 4  | 05-18-2014 | 21:45:30 | 1       |
| 5  | 05-18-2014 | 21:50:50 | 3       |
+--------------------------------------+

会话列是用户的会话 ID。我想查询该表以获取每小时的总访问者和唯一身份访问者,以获得如下结果:

+-----------------------+
| Time | Total | Unique |
+-----------------------+
| 20   | 2     | 1      |
| 21   | 3     | 2      |
+-----------------------+

唯一身份访问者是指在“访问”表中的任何位置具有以前从未出现过的会话的访问者。

以下仅选择每小时内的唯一访问者:

SELECT COUNT(*) Total, COUNT(DISTINCT Session) Unique, HOUR(Time) Time
WHERE Date = '05-18-2014'
FROM Visits
GROUP BY HOUR(Time)

以下似乎可行,但需要两个查询和一个子查询:

SELECT COUNT(*) Total, HOUR(Time) Time
FROM Visits
GROUP BY HOUR(Time);

SELECT COUNT(*) Unique, HOUR(Time) Time
FROM (
    SELECT *
    FROM Visits
    GROUP BY Session
    ORDER BY Date, Time DESC
) UniqueVisits
WHERE Date = '05-18-2014'
GROUP BY HOUR(Time);

有没有更简单的方法来得到这两个总数?

【问题讨论】:

  • 您能否编辑您的问题以提供样本数据所需的结果?
  • 啊,对不起。已添加。
  • 我就是这样解释这个问题的。我的回答应该有效。

标签: mysql sql


【解决方案1】:

我认为“不同”是指您只希望一个会话计数一次(在第一个小时内)。如果是这样,您可以这样做:

select max(h.total) as total, count(firstvisit.session) as Firsts, h.hr
from (select hour(time) as hr, count(*) as total
      from visits v
      where Date = '05-18-2014'
      group by hour(time)
     ) h left outer join
     (select session, min(hour(time))as hr
      from visits v
      where Date = '05-18-2014'
      group by session
     ) firstvisit
     on h.hr = firstvisit.hr
GROUP BY h.hr;

【讨论】:

  • +1,我试图避免对 min(hour(time)) 计算表达式的连接,但很遗憾,我们无法保存它。
  • 谢谢,这似乎比我的子查询解决方案稍微快一点,我的服务器上的 500k 行大约需要一秒钟。有没有办法进一步优化?
  • @AlanEdwardes 。 . .你有visits(date, time, session) 的索引吗?
猜你喜欢
  • 2020-08-04
  • 1970-01-01
  • 1970-01-01
  • 2018-07-25
  • 1970-01-01
  • 1970-01-01
  • 2018-03-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多