2016-07-28 31 views
0
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 

我有這張表,我想知道,平均來說,在第一次購買之前用戶來了多少次。平均來說,用戶在第一次購物之前來了多少次?

  • 我們可以忽略用戶2和3,因爲他們從未進行過購買。
  • 用戶1在進行購買之前來了兩次。
  • 用戶4在購買前出現過3次。

所以平均將是(2 + 3)/ 2 = 2.5

任何知道如何才能寫這樣的查詢?

+0

添加幾個行的樣本數據,並指定了(新)預期的結果! – jarlh

+0

你的主鍵是什麼?如果你按用戶和購買日期安排,可能會更清楚 – Strawberry

+0

購買可以超過1?這是如何確定的? – Jonny

回答

2
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 
) 

子查詢計算已經進行了購買(EXISTS)每個user_id的,但不是當前行(NOT EXISTS)前。

在主要級別,做AVG()以獲得平均數。

也許,根據dbms,您需要執行avg(cnt * 1.0)以避免整數結果。

+0

它給了我1.5,我相信它應該返回給定的數據2.5。 –

+1

用戶1在第一次購買前有一次,用戶2次。平均1.5。等一下,你的意思是包括首次購買。將編輯!完成! – jarlh

0

查找進行購買的所有用戶第一次購買日期,然後加入到:

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 

隨着user_id索引這將執行得很好。

0

你可以這樣做:

SELECT AVG(cpt) FROM (
    SELECT sales_user.user_id, COUNT(*) AS cpt 
    FROM (
     SELECT * 
     FROM users 
     WHERE purchases=1) sales_user 
    JOIN users ON sales_user.user_id=users.user_id 
    WHERE users.came_to_site < sales_user.came_to_site 
    GROUP BY sales_user.user_id); 
相關問題