我想知道用户访问网站'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)。我想弄清楚一周内访问的平均日期。有什么想法吗?谢谢!
如果你想在一周内按点击分组,你可以尝试更像这样的东西:
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
,这将更容易(更不用说更有效)