我有大量的记录......让我们说10,000名运动员,按体育分组,其中(下面的数字可变):
4,000 are from NBA
2,000 are from NHL
3,000 are from MLB
1,000 are from NFL
如何构建一个样本查询,该查询将根据总体采样100条记录,而不是完全随机但是拉出:
NBA /全人口= X. 从MainTable中选择Top X *联盟=' NBA' (像这样) 40个名字来自NBA 20个名字来自NHL 30个名字来自美国职棒大联盟 10个名字来自NFL。这只是人口的一个样本,这里的逻辑是计算与整个人口的比率,然后将其应用于样本规模。
此致
答案 0 :(得分: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
答案 1 :(得分: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
使用嵌套子查询和派生表解释上述查询:
派生表 main 是确切的源 MainTable ,其中一个名为 Rank 的新列提供了序数的记录数为每个联盟。所以对于第一个NBA纪录(不一定是第一排),它被标记为1级,下一个NBA纪录(可以出现在第89行的任何地方)被标记为2,依此类推每个联盟。是的,如果需要, Rank 将达到4,000!
计算出 Rank 字段后,为每个联盟分组提供序数1,2,3,...指标,然后我们将此SELECT
语句定位为派生表在FROM
子句中,以便在WHERE
过滤器中使用 Rank 获取样本比率。我们无法在同一SELECT
电话中计算列和过滤器。
样本比率是用于计算商的最后两个子查询:(与当前行匹配的联盟记录的数量/表记录的总数)。然后将此值乘以每个样本配额100。 CInt
用于返回可能的小数比的整数值。还要考虑Round(..., 0)
舍入而不是带小数点。