2016-08-22 47 views
1

要衡量免費產品獲取新客戶的有效性,我希望找到在收到免費訂單後支付訂單的客戶數量。我的表如下所示:在其他條件行之後查找某些條件的行

id | user | total 
----------------- 
1 1  0.00 
2 1  57.33 
3 2  58.21 
4 2  0.00 
5 3  26.10 
6 3  0.00 
7 3  64.94 
8 4  0.00 
9 5  34.54 

在這個表中有五大客戶:12345。這是所有我能想到的條件。

  • 用戶1接收到的以任意順序,然後置於一個支付命令,這個計數
  • 用戶2放置在支付訂單,然後接收到以任意順序,這不計數
  • 用戶3放置在支付順序,然後接到自由順序,然後將其置於一個支付命令,這個不計
  • 用戶4接收以任意順序,這不計數
  • 用戶5放置在支付順序,這不計數

您可以看到我只關心在收到免費訂單前沒有下過付款訂單的用戶,然後發出付款訂單。我在尋找伯爵的更聲明的定義是:

  • 用戶下了訂單n其中n->total > 0收到訂單m,其中m->total == 0m->id < n->id後。沒有訂單w其中w->total > 0w->id < m->id

一些create table代碼:

create table orders (
    id int NOT NULL AUTO_INCREMENT, 
    user int, 
    total decimal(6,2), 
    PRIMARY KEY(id) 
); 

insert into orders (user, total) values 
    (1, 0.00), 
    (1, 57.33), 
    (2, 58.21), 
    (2, 0.00), 
    (3, 26.10), 
    (3, 0.00), 
    (3, 64.94), 
    (4, 0.00), 
    (5, 34.54); 

在這種情況下,預計產量將1

+0

是這條線是否正確? **您可以看到我只關心在收到付款訂單前沒有下過付款訂單的用戶,** – 1000111

+0

爲了解決您的邏輯問題,我相信我們需要查看每個用戶的三個最新ID值以及相應的時間戳。這在MySQL中有點棘手,我認爲答案可能需要一些動態SQL。 –

+0

@ 1000111抱歉,在那裏犯了一個錯字。我已經解決了它,它應該是「誰沒有收到免費訂單之前下了付費訂單」。 – gator

回答

2

簡單聚合組合有條件的聚合可以讓你找到你正在尋找的用戶。

SELECT 
    [user] 
    ,MIN(id) as MinId 
    ,MIN(CASE WHEN total = 0 THEN id END) as MinZeroId 
    ,MIN(CASE WHEN total > 0 THEN id END) as MinPositiveId 
FROM 
    orders 
GROUP BY 
    [user] 
HAVING 
    MIN(id) = MIN(CASE WHEN total = 0 THEN id END) 
    AND MIN(CASE WHEN total > 0 THEN id END) > MIN(CASE WHEN total = 0 THEN id END) 

即最小ID針對最小ID的用戶以$ 0總金額進行比較,然後將最小內徑爲總計> $ 0,則比較的最小內徑爲$ 0總計。

如果你想要原始記錄只需添加一個外部選擇來達到它。

SELECT o.* 
FROM 
    (
     SELECT 
      [user] 
     FROM 
      orders 
     GROUP BY 
      [user] 
     HAVING 
      MIN(id) = MIN(CASE WHEN total = 0 THEN id END) 
      AND MIN(CASE WHEN total > 0 THEN id END) > MIN(CASE WHEN total = 0 THEN id END) 
    ) t 
    INNER JOIN orders o 
    ON t.[user] = o.[user] 
0

您需要第一條記錄(where子句)總數爲零且存在總數不爲零的後續記錄的記錄對(自聯接)。 (不必是下一個記錄,對吧?)

Select i.User, i.total firstTotal, 
    n.Total firstpaidTotal 
from table i 
    join table n 
    on n.Id > i.id 
     and n.user = i.user 
     and n.total > 0 
where i.total = 0 
    and not exists 
    (Select * from table 
    where user = i.user 
     and id < i.Id)   
+0

不完全是因爲他的例子中的用戶3。如果0.00然後> 0.00然後0.00應該排除,這不會是您的查詢的情況。好的開始:-) –

+0

不存在將排除用戶3.它只允許記錄,其中id是該用戶的最低值,總數= 0 –

0

這可能會解決你的問題:

select a.id from orders a 
join orders b on (a.user = b.user and a.id < b.id and a.total = 0) 
join (select min(id) as id, user from orders group by user) c on (a.user = c.user and a.id = c.id) 

讓我知道什麼是錯的:)

0

另一種可能的解決方案,雖然我個人很喜歡@馬特回答了這一個:

SELECT a.user 
FROM orders a 
    -- search first user_line 
    JOIN (
     SELECT b.user, MIN(b.id) first_id 
     FROM orders b 
     GROUP BY b.user 
    ) c ON a.user = c.user AND a.id = c.first_id 
WHERE 
    -- check first line is total=0 
    a.total = 0 
    -- has later lines with total>0 
    AND EXISTS (
     SELECT 'exists' 
     FROM orders c 
     WHERE 
     c.user = a.user 
     AND c.total > 0 
     AND c.id > a.id 
    ) 
相關問題