2012-10-02 35 views
0

爲了訓練機器學習模型,我必須檢索由平衡數量的當前用戶和以前用戶組成的用戶樣本。 Tha數據庫由表all_users和former_users組成。如何從兩個表中選擇平衡的隨機樣本記錄?

不平衡樣品的情況下(100條記錄),下面的查詢與所需的列返回的記錄:

SELECT t1.user_property1, t2.user_property2, t3.valid_to FROM additional_info t1 LEFT JOIN all_users t2 ON t1.user_ID = t2.user_ID LEFT JOIN former_users t3 ON t1.user_ID = t3.user_ID ORDER BY random() LIMIT 100 

爲了獲得均衡的樣品,應該有一半的記錄與用戶被存儲在表以前的用戶和一半的表all_users,而這些用戶在同一時間不在表前用戶(否則樣本不會被平衡)。

有誰知道,從表additional_info的附加屬性沿表all_users和former_users從表all_users和former_users檢索平衡隨機樣本的最方便的方法是什麼?

謝謝!你可能會考慮做

回答

1

做了以下內容:

(SELECT t1.user_property1, t2.user_property2, t3.valid_to FROM additional_info t1 LEFT JOIN all_users t2 ON t1.user_ID = t2.user_ID INNER JOIN former_users t3 ON t1.user_ID = t3.user_ID ORDER BY random() LIMIT 50) 
UNION 
(SELECT t1.user_property1, t2.user_property2, NULL FROM additional_info t1 LEFT JOIN all_users t2 ON t1.user_ID = t2.user_ID WHERE t1.user NOT IN (SELECT user_ID FROM former_users) ORDER BY random() LIMIT 50) 

,但一直在尋找更好的解決方案。

1

的一件事是:

Query 1 - SELECTS random non-former users joined to additional_info with a LIMIT of 50 
Query 2 - SELECTS random former users joined to additional_info with a LIMIT of 50 

,然後將結果與UNION

(Query 1) UNION (Query 2) 

這會給你隨機結果爲兩個標準相結合,共100個用戶。

+0

在這種情況下,您應該使用UNION ALL而不是UNION。後者增加了一個額外的步驟來刪除重複,這是沒有必要的。 –

+0

沒有非前用戶表。其實我想知道是否有一種'否定連接'的方法。 –

+0

你剛發佈的解決方案是我會做的(只是沒有模式來實際創建sql)。我唯一能想到的其他事情就是做一個外連接,並檢查第三個表中的字段是否爲空,而不是否爲NOT。無論哪種方式,它可能沒有太大的不同,我想不出一個更簡單的解決方案。 – jcern