我有很多记录.比方说10,000名运动员,按运动分组(下面的数字是可变的):
4,000 are from NBA
2,000 are from NHL
3,000 are from MLB
1,000 are from NFL如何构建一个示例查询,该查询将根据总体情况对100条记录进行采样,而不是完全随机,而是提取:
NBA/整个Population=X从MainTable league= 'NBA‘中选择顶级X*(如下所示)
40名来自NBA,20名来自NHL,30名来自MLB,10名来自NFL。
这只是人口的一个样本,这里的逻辑是计算出整个人口的比率,然后把它们应用到样本的大小上。
问候
发布于 2017-01-20 23:26:24
考虑对级别顺序使用计数关联子查询,然后将其用作样本比率的筛选标准。
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要用嵌套子查询和派生表解释上述查询:
SELECT语句定位为FROM子句中的派生表,以便在WHERE筛选器中对样本比率使用秩。我们不能在同一个SELECT调用中计算列和筛选器。CInt用于返回可能的十进制比的整数值。还可以考虑使用Round(..., 0)来代替带小数点的圆圈。发布于 2017-01-20 20:34:13
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.Closehttps://stackoverflow.com/questions/41767384
复制相似问题