2017-01-20 60 views
0

我有記錄的人羣......讓我們說1萬名多名運動員,通過運動,其中(下面的數字是可變的)分組:SQL抽樣

4,000 are from NBA 
2,000 are from NHL 
3,000 are from MLB 
1,000 are from NFL 

如何建立一個樣本查詢,將樣品100個記錄根據人口,沒有完全隨機的,而是拉出來:

NBA /全人口= X 選擇頂層X *從MainTable其中聯賽=「NBA」(像這樣)

40名球員來自NBA 20個名字來自NHL 30個名字來自MLB 10個名字來自NFL。

這只是人口的一個樣本,這裏的邏輯是計算比例與整個人口的比例,然後將其應用於樣本量。

問候

+0

可能的複製(http://stackoverflow.com/questions/30235542/sql-random-sample-with-groups) –

+2

哪個DBMS您正在使用? –

+0

@PeterB - 你是怎麼認爲它是'SQL SERVER'的 –

回答

0

考慮使用的計數相關子查詢對等級次序您然後作爲過濾條件對樣品比使用。

SELECT main.* 
FROM 
    (SELECT *, 
     (SELECT Count(*) FROM MainTable sub 
      WHERE sub.League = t.League AND sub.UniqueID <= t.UniqueID) As Rank 
    FROM MainTable t) AS main 

WHERE main.Rank <= CInt((SELECT Count(*) FROM MainTable sub 
         WHERE sub.League = main.League)/
         (SELECT Count(*) FROM MainTable) * 100) 
ORDER BY main.League, main.Rank 

上文嵌套子查詢和派生表查詢解釋:

  1. 派生表,,是確切來源MainTable用新的柱稱爲排名給出一個每個聯賽的記錄數量是有序的。因此,對於第一個NBA記錄(不一定是第一排),它被標記爲1,下一個NBA記錄(其可以出現在第89排的任何地方)被標記爲2,以此類推。是的,如果需要,排名將上升到4,000!

  2. 一旦排名場計算給序1,2,3,...每個聯賽分組指標,然後我們才能使用排名中的位置本SELECT語句作爲派生表中FROM條款WHERE過濾器的樣本比。我們無法計算同一個SELECT調用中的列和過濾器。

  3. 採樣率是用於計算商的最後兩個子查詢:(與當前行匹配的聯賽記錄數/表記錄總數)。然後這個值乘以每個樣本配額100。 CInt用於返回可能的小數比例的整數值。也考慮Round(..., 0)哪些輪次而不是帶小數點。

[與組SQL隨機抽樣]的
+0

Parfait ...有沒有辦法隨機化排名?它似乎是以同樣的方式排列記錄......如果我想在每次運行此查詢時都得到不同的結果,該怎麼辦? –

+0

好問題。考慮作爲一個新問題,因爲答案可能涉及數據庫層之上的應用層代碼(VBA,PHP,Python,Java等)。SQL最終只是一種特殊用途的聲明性語言,其中列/變量曾經聲明是不可變的。 – Parfait

0
Dim Leagues(1 To 4) As String 

Leagues(1) = "NHL" 
Leagues(2) = "MLB" 
Leagues(3) = "NFL" 
Leagues(4) = "MLS" 


Set db = CurrentDb 

For x = 1 To 4 

y = 0 
sqql = "Select * from Maintable Where League = '" & leagues(x) & "'" 

Set cf = db.OpenRecordset(sqql) 

Set samp = db.OpenRecordset("RANDOMSAMPLE") 






Do While y < (x * 1000) ' adjust as necessary just swagged in you wanted 1000 from league 1, 2000 league 2 etc 

cf.MoveLast 
cf.MoveFirst 

i = Int((cf.RecordCount - 1 + 1) * Rnd + 1) 

cf.Move (i) 

With samp 

.AddNew 

.fields("Yourfield here") = cf![your field ] 

' repeat as nec 

.Update 

End With 
y = y + 1 
Loop 


cf.Close 
Next x 

samp.Close