mysql - 访问网站的平均日期

标签 mysql sql

我想知道用户每周访问网站“A”的平均日期。如果用户没有访问网站“A”,我会排除数据(例如,id = 2)。而且我还需要考虑日期范围(将其限制在一周范围内,例如 01-JAN-2018 到 07-JAN-2018)

示例输入(表:用户)

id   date           website
1    01-JAN-2018    A
1    03-JAN-2018    B
1    04-JAN-2018    C
1    04-JAN-2018    C
2    03-JAN-2018    C
3    03-JAN-2018    A
3    05-JAN-2018    B
4    05-JAN-2018    A

第一步会像这样:

id   date           website
1    01-JAN-2018    A
1    03-JAN-2018    B
1    04-JAN-2018    C
1    04-JAN-2018    C
3    03-JAN-2018    A
3    05-JAN-2018    B
4    05-JAN-2018    A

输出将只返回用户访问网站(包括 ABC)的平均日期。在这种情况下,用户 1 每周访问三天(忽略重复),用户 3 每周访问两天。平均点击日期将是总和(天)/用户数。

我的第一个想法:

SELECT COUNT(Date), Date
FROM user
WHERE id IN (
  SELECT id FROM user
  WHERE web = 'A'
);

假设我只想考虑本周范围(2018 年 1 月 1 日至 2018 年 1 月 7 日)。我想计算一周内访问的平均日期。对此有什么想法吗?谢谢!

Link for Demo

最佳答案

如果你想按一周内的点击率分组,你可以尝试更像这样的方法:

select year(STR_TO_DATE(date,'%d-%b-%y')) year, 
  weekofyear(STR_TO_DATE(date,'%d-%b-%y')) week,   
  count(*) hits
from user
group by year(STR_TO_DATE(date,'%d-%b-%y')), weekofyear(STR_TO_DATE(date,'%d-%b-%y'))

分组依据是关键:这会将特定一周的所有点击分组在一起,而 group by date 会将每一天分开。

如果您想要多个星期的平均值,您需要将此查询用作子查询,并对计数列进行平均。

如评论中所述,如果将日期存储为 date 而不是 varchar,这会容易得多(更不用说效率更高了)

关于mysql - 访问网站的平均日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49101668/

相关文章:

mysql - 更新同一语句中的多个列

sql - Oracle 11g CREATE VIEW 使用 CONNECT BY 和多个表

php - 如何以 2 组为一组回显结果?

mysql - 在mysql中创建带有事务的过程

mysql - 从 MySQL 迁移到具有 unicode 缺陷的 Postgres

php - 使所有页面都以不同的 html 结构表示来自不同表的数据

sql - 选择 * 并为一列创建别名

sql - postgresql 挑战 : how to select sum of one column having another column like 'ab%'

mysql - MySQL存储过程中的if语句,用于选择数据

mysql - 向 MySQL Inner Join 添加多个条件