Mysql 平均而言,用户在第一次购买之前会来多少次?

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

我有这张表,我想知道,一个用户在第一次购买前平均来过多少次

我们可以忽略用户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           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。等等,你的意思是包括首次购买。将编辑!完成!