2016-09-30 39 views
0

我有我的表,它記錄客戶購買的物品的以下字段:過濾行

customer_id, item_id, week_id 

,我想過濾此表僅限於每週至少購買1件商品的顧客,至少連續5周。

我目前的想法是在customer_id和week_id字段上使用DISTINCT,然後在customer_id上執行GROUP BY。但是,我不知道應該使用哪個集合函數,或者如果我應該使用UDF函數來完成它(所以我的聚合函數會將week_id分組到集合中,然後在此集合上應用我的UDF)。

另一種方法是創建一個week_id_1,week_id_2,week_id_3,week_id_4列,以便根據week_id列填充增加的值,然後在表上自己執行5次LEFT JOIN(on week_id ,然後在week_id_1上,然後在week_id_2上等)。這似乎很昂貴,我想知道是否沒有更好的方法。

任何幫助將不勝感激,因爲我不是很熟悉SQL。

回答

1

如果要連續五週,則使用join,假設week_id每週增加1。這裏有一種方法:

select distinct customer_id 
from t t1 join 
    t t2 
    on t2.customer_id = t1.customer_id and 
     t2.week_id = t1.week_id + 1 join 
    t t3 
    on t3.customer_id = t1.customer_id and 
     t3.week_id = t1.week_id + 2 join 
    t t4 
    on t4.customer_id = t1.customer_id and 
     t4.week_id = t1.week_id + 3 join 
    t t5 
    on t5.customer_id = t1.customer_id and 
     t5.week_id = t1.week_id + 4; 
+0

好吧,這是比我的第二個方法,有點相同的方法清潔你不創建列week_id_1,week_id_2,week_id_3,week_id_4,但使用加入這樣做。 但是,這意味着我需要4個連接,如果我沒有弄錯,這是一個非常昂貴的操作。它是解決這類問題的標準方法嗎(例如,加入表格來分析幾行之間的依賴關係),還是有一種更有效的方法來實現,而沒有多少聯接? –

+0

因爲讓我說我不想接下來的5周,但接下來的20周。那將意味着19個連接,這將非常昂貴。 –

+0

@KestemontMax。 。 。 20周是與5周不同的問題。 –