基于整个人口的

时间:2017-01-20 15:41:38

标签: sql ms-access

我有大量的记录......让我们说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。

这只是人口的一个样本,这里的逻辑是计算与整个人口的比率,然后将其应用于样本规模。

此致

2 个答案:

答案 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

使用嵌套子查询和派生表解释上述查询:

  1. 派生表 main 是确切的源 MainTable ,其中一个名为 Rank 的新列提供了序数的记录数为每个联盟。所以对于第一个NBA纪录(不一定是第一排),它被标记为1级,下一个NBA纪录(可以出现在第89行的任何地方)被标记为2,依此类推每个联盟。是的,如果需要, Rank 将达到4,000!

  2. 计算出 Rank 字段后,为每个联盟分组提供序数1,2,3,...指标,​​然后我们将此SELECT语句定位为派生表在FROM子句中,以便在WHERE过滤器中使用 Rank 获取样本比率。我们无法在同一SELECT电话中计算列和过滤器。

  3. 样本比率是用于计算商的最后两个子查询:(与当前行匹配的联盟记录的数量/表记录的总数)。然后将此值乘以每个样本配额100。 CInt用于返回可能的小数比的整数值。还要考虑Round(..., 0)舍入而不是带小数点。