Mysql 平均而言,用户在第一次购买之前会来多少次?
我有这张表,我想知道,一个用户在第一次购买前平均来过多少次 我们可以忽略用户2和3,因为他们从未购买过。 用户1在购买前来过2次。 用户4在购买之前来过3次。 所以平均值是2+3/2=2.5 你知道我怎么写这样的查询吗Mysql 平均而言,用户在第一次购买之前会来多少次?,mysql,sql,Mysql,Sql,我有这张表,我想知道,一个用户在第一次购买前平均来过多少次 我们可以忽略用户2和3,因为他们从未购买过。 用户1在购买前来过2次。 用户4在购买之前来过3次。 所以平均值是2+3/2=2.5 你知道我怎么写这样的查询吗 id(pk) user_id(int) came_to_site(date_time) purchases(int) 1 1 27-8-2016:10:12:23 0 2
id(pk) user_id(int) came_to_site(date_time) purchases(int)
1 1 27-8-2016:10:12:23 0
2 2 27-8-2016:10:20:23 0
3 1 28-8-2016:10:12:23 1
4 3 29-8-2016:10:12:23 0
5 4 29-8-2016:11:40:23 0
6 4 30-8-2016:10:12:23 0
7 4 30-8-2016:12:12:23 1
8 1 30-8-2016:12:30:23 1
子查询统计每个已进行购买的用户id,但不在当前行不存在之前
在主要级别,执行平均值以获得平均数
也许,根据dbms的不同,您需要执行avgcnt*1.0以避免整数结果
子查询统计每个已进行购买的用户id,但不在当前行不存在之前
在主要级别,执行平均值以获得平均数
也许,根据dbms的不同,您需要执行avgcnt*1.0以避免整数结果。查找所有购买用户的首次购买日期,然后加入该日期:
select avg(cnt)
from
(
select user_id, 1 + count(*) as cnt
from tablename t1
where purchases = 0
and exists (select 1 from tablename t2
where t2.user_id = t1.user_id
and t2.purchases = 1)
and not exists (select 1 from tablename t3
where t3.user_id = t1.user_id
and t3.purchases = 1
and t3.came_to_site < t1.came_to_site)
group by user_id
)
如果用户id上有索引,这将执行得非常好。找到所有购买用户的首次购买日期,然后加入:
select avg(cnt)
from
(
select user_id, 1 + count(*) as cnt
from tablename t1
where purchases = 0
and exists (select 1 from tablename t2
where t2.user_id = t1.user_id
and t2.purchases = 1)
and not exists (select 1 from tablename t3
where t3.user_id = t1.user_id
and t3.purchases = 1
and t3.came_to_site < t1.came_to_site)
group by user_id
)
如果用户id上有一个索引,这将很好地执行。您可以执行以下操作:
select avg(visits)
from (select t.user_id, count(*) visits
from (select user_id, min(came_to_site) first
from mytable
where purchases > 0
group by user_id) fpd
join mytable t on t.user_id = fpd.user_id and t.came_to_site < fpd.came_to_site) x
你可以做:
select avg(visits)
from (select t.user_id, count(*) visits
from (select user_id, min(came_to_site) first
from mytable
where purchases > 0
group by user_id) fpd
join mytable t on t.user_id = fpd.user_id and t.came_to_site < fpd.came_to_site) x
再添加几行示例数据,并指定新的预期结果!你的主键是什么?如果您按用户和购买日期进行安排,可能会更清楚。购买是否可以超过1?这是怎么决定的?@Jonny,是的,可能不止一个。但这并不重要。请看最后一条记录,它不会影响平均值。设计这样的数据库似乎有点奇怪:添加了几行样本数据,还指定了新的预期结果!你的主键是什么?如果您按用户和购买日期进行安排,可能会更清楚。购买是否可以超过1?这是怎么决定的?@Jonny,是的,可能不止一个。但这并不重要。请看最后一条记录,它不会影响平均值。按这种方式设计数据库似乎有点奇怪,它给了我1.5,我认为它应该在给定数据上返回2.5。用户1在第一次购买之前出现过1次,用户2次。平均值1.5。等等,你的意思是包括首次购买。将编辑!完成!它给了我1.5,我认为它应该在给定的数据上返回2.5。用户1在第一次购买之前出现过1次,用户2次。平均值1.5。等等,你的意思是包括首次购买。将编辑!完成!