【问题标题】:Average date of visiting website平均访问网站日期
【发布时间】:2018-03-07 03:11:38
【问题描述】:

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

示例输入(表:用户)

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

【问题讨论】:

  • 演示在 MySQL 中,所以我删除了 Postgres 标签。
  • 我完全不知道“2”是如何计算的。
  • 将日期存储为日期

标签: mysql sql


【解决方案1】:

如果您想在一周内按点击数进行分组,您可以尝试类似这样的方法:

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 将每天分开。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-12
    • 1970-01-01
    • 1970-01-01
    • 2012-05-05
    • 2018-02-20
    相关资源
    最近更新 更多