访问网站的平均日期

时间:2018-03-04 23:39:13

标签: 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'
);

假设我只想考虑本周范围(01-JAN-2018到07-JAN-2018)。我想弄清楚一周内访问的平均日期。有什么想法吗?谢谢!

Link for Demo

1 个答案:

答案 0 :(得分:0)

如果你想在一周内按点击分组,你可以尝试更像这样的东西:

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

,这将更容易(更不用说更有效)