2017-01-20 14 views
0

に基づいて、私は、レコードの人口を持っている...のは(下の数字は変数になります)スポーツによってグループ化された万人の選手を、言わせて: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 *リーグ=「NBA」(このようなもの)

MainTableから40名はNBA 名前はNHLからのものです 30名前はMLBからです 10の名前はNFLからです。

これは母集団の単なるサンプルです。ここでは、母集団全体の比率が何であるかを計算し、それをサンプルサイズに適用します。

よろしく

+0

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

+2

? –

+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が付いています。そして、はい、ランクは必要に応じて最大4000になります!

  2. このランクフィールドは序数1を与えて計算されると、2、3、...各リーグのグループ化のための指標は、我々はその後、ランクを使用するためにFROM句の派生テーブルとしてこのSELECT声明を配置サンプル比率はWHEREのフィルタになります。 SELECTコールで列とフィルタを計算することはできません。

  3. サンプル・レシオは、(現在の行に一致するリーグ・レコード数/合計のテーブル・レコード数)を計算する商に使用される最後の2つのサブクエリです。この値にサンプルクォータあたり100を掛けます。 CIntは、可能な10進数の整数値を返すために使用されます。小数点以下の小数点以下を丸めたRound(..., 0)も考えてください。使用しているDBMS [グループと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 
関連する問題