2016-02-26 61 views
0

我有一個客戶訂單表,該表類似於下面:檢查特定的ID的出現一行之前在表

order_id | customer_id | date | ... 
----------------------------------------- 
    583   192  2015-05-01 ... 
    734   143  2015-06-04 ... 
    801   455  2015-07-02 ... 
    ...   ...   ...  ... 

我想找到我多少新客戶獲得在特定的月份 。通過查詢上面的訂單表並找到當月出現但在該月之前沒有出現的值(在該月之後沒有問題),可以找到新客戶。我正在尋找新的customer_id的第一個實例。

有沒有辦法在一個SQL語句中做到這一點?我可以做類似下面我想:

  • 通過查詢使用LIKE YYYY-MM-%
  • 檢查表與customer_id實例較小order_id(按理說一個較小的數據庫得到了一個月的所有order_idDISTINCT customer_idorder_id將早期命令)
  • 如果找到,則跳過
  • 如果沒有找到,遞增計數器
+0

哪個db引擎? – user2407394

+0

你想要獨特的用戶,你不需要循環所有的結果只是使用group by並獲得唯一的結果。同樣,你只是數它們,所以如果你計算第一個或後一個數,那麼它確實沒有什麼區別,只需要計數獨特的數。 –

回答

1

假設date_From是你的起始日期和date_To是週期的最後一天,你能做到這一點是這樣的:

select distinct T1.customer_id 
from your_table as T1 
    left outer join your_Table as T2 on 
     T1.customer_id = T2.customer_id and T2.date < date_From 
where 
    T1.date <= date_To 
    and T1.date >= date_From 
    and T2.customer_id is null 

這裏您的日期,並檢查之前,使用相同的customer_id和日期加入到同一個表中加入無結果(按T2.customer_id is null)確保您的customer_id首次按您的期限順序出現,而不是更早。

1

這將會列出你的新客戶在一月2016

select customer_id,order_id from customer c 
where MONTHNAME(date) = 'January' and YEAR(date) = 2016 
    and date >= 
(select min(date) mindate from customer c1 
where c.customer_id = c1.customer_id 
having MONTH(c.date) <> MONTH(c1.mindate) or YEAR(c.date) <> YEAR(c1. 
mindate)); 
1

你不需要的order_id,如果你需要統計客戶。所有你需要的是customer_id和date:

select count(*) from 
    (select min(date) as first_contact, customer_id 
     from the_table 
     group by customer_id) new_customers 
where new_customers.first_contact > start_of_the_month 
    and new_customers.first_contact < end_of_the_month 
相關問題