2015-10-01 13 views
1

我有兩張表,customerusermap和用戶。每當用戶註冊我們的產品時,他們會立即將其添加到名爲users的表中,但直到他們開始爲用戶付款時纔會將其添加到名爲customerusermap的表中。根據內部連接發現的最早日期進行計數?

在使用者表看起來像這樣:

id | customer_id  | firstname | lastname | created_at 
------------------------------------------------------- 
1725 | cus_3hEmhErE2jbwsO | Abby  | Smith | 2015-03-19 
1726 | cus_7oNweUrE4jbwr2 | Sam  | Peters | 2015-06-20 

的customerusermap表看起來像這樣:

customer_id  | user_id | created_at 
------------------------------------------ 
cus_3hEmhErE2jbwsO | 9275 | 2015-09-01 
cus_3hEmhErE2jbwsO | 2628 | 2015-09-05 
cus_3hEmhErE2jbwsO | 2358 | 2015-07-05 
cus_3hEmhErE2jbwsO | 3158 | 2015-08-05 
cus_3hEmhErE2jbwsO | 2487 | 2015-08-05 
cus_3hEmhErE2jbwsO | 6044 | 2015-08-05 
cus_7oNweUrE4jbwr2 | 8094 | 2015-08-25 
cus_7oNweUrE4jbwr2 | 2345 | 2015-09-02 

在這個例子中,阿比(cus_3hEmhErE2jbwsO)的支付6個用戶。她開始爲用戶2358 2015-07-05付款,因此她應該被視爲付費用戶07-2015,而不是03-2015。山姆正在爲2個用戶付費,他在08-2015年開始爲用戶8094付款,因此他被認爲是08-2015的付費用戶,而不是06-2015。我有抓住查詢和組由每月付費用戶數:

SELECT concat(extract(MONTH from u.created_at),'-',extract(year from u.created_at)) as "Month", 
COUNT(distinct u.email) as "Total AB Paying Customers" 
FROM customerusermap AS cm, users AS u 
WHERE cm.customer_id=u.customer_id AND cm.user_id <> u.id 
GROUP BY 1,extract(month from u.created_at),extract(year from u.created_at) 
ORDER BY extract(year from u.created_at),extract(month from u.created_at); 

但由客戶被添加到用戶表,而不是他們真正開始支付日止這抓住和計數。我如何獲取計數,以便在customerusermap表中獲取最早的日期?有什麼需要的輸出應該看起來像這個例子是:

Month | Total AB Paying Customers 
------------------------------------- 
07-2015 | 1 
08-2015 | 1 
+0

你能提供需要的輸出嗎? – igr

+0

嘿,請看編輯的問題! –

+0

@AshleyI。請檢查我的答案。 –

回答

1

您可以使用下面的查詢:

SELECT CONCAT(EXTRACT(MONTH FROM startedPayingDate), '-', 
       EXTRACT(YEAR FROM startedPayingDate)) AS "Month", 
     COUNT(*) AS "Total AB Paying Customers" 
FROM (  
    SELECT customer_id, MIN(created_at) AS startedPayingDate 
    FROM customerusermap AS cm 
    WHERE NOT EXISTS (SELECT 1 
        FROM users AS u 
        WHERE cm.user_id = u.id) 
    GROUP BY customer_id) AS t 
GROUP BY 1 

我用NOT EXISTS運營商排除與客戶'爲自己付出的記錄(如果這真的是你的意圖)。

一旦你得到MIN(created_at)日期每customer_id,那麼你可以很容易地計算每個日期在外部查詢。

Demo here

+0

非常感謝!我只是啾啾查詢了一下(即,而不是WHERE NOT EXISTS(....)我放在哪裏cm.customer_id = u.customer_id和cm.user_id <> u.id –