2016-03-15 69 views
3

我試圖找出在Big Query中的表中爲每個組抽取100條記錄的隨機樣本的最佳方法。在大查詢中從每個組中抽取一個隨機樣本

例如,我有一個表,其中列A是唯一的recordID,列B是該記錄所屬的組ID。對於每個不同的組ID,我想隨機抽取100個recordID。有沒有簡單的方法來完成這個?

回答

2

類似下面應該工作

SELECT recordID, groupID 
FROM (
    SELECT 
    recordID, groupID, 
    RAND() AS rnd, ROW_NUMBER() OVER(PARTITION BY groupID ORDER BY rnd) AS pos 
    FROM yourTable 
) 
WHERE pos <= 100 
ORDER BY groupID, recordID 

還要檢查RAND()here如果你想改善隨機性

+0

非常有幫助!非常感謝! – Tas

+1

你真的不需要最後的ORDER BY groupID,recordID –

+0

沒錯!由於在生產中選擇了外部命令,最終會導致資源超出問題。仍然用於簡單測試 –

0

也有類似的需求,即整羣抽樣,超過400M多列,但打Exceeded resources...錯誤當使用ROW_NUMBER()

如果您不需要RAND(),因爲你的數據是無序的,無論如何,這(在我的情況< 30歲)表現相當好:

SELECT ARRAY_AGG(x LIMIT 100) 
FROM yourtable x 
GROUP BY groupId 

您可以:

  • 裝飾與UNNEST()如果前端無法呈現嵌套記錄
  • add ORDER BY groupId更快找到/確認圖案