如何根据查询结果return在table中随机记录?

How to return random records in a table based on query results?

我有一个 table 名为 Values 的数以千计的记录(样本少了很多)。数据本身是唯一的,除了一些记录共享相同的ID。

所以我需要根据 TestQ1 的总数查询 return 个随机记录。例如,对于 ID 120,查询共有 9 条记录,因此每次查询 运行 时应该有 3 条随机记录,因为这就是测试 table 指示的内容(此 table 更改每周的“测试”数字)。

如图:

“值”table 是原始数据。 “TestQ1”查询具有该特定“ID”的总计数 右边是应该 returned 的记录数。

这是我所能得到的:

SELECT TOP 5 Values.ID, Values.Test, Values.State, Rnd([Values]![ID]) AS [Random No], * FROM [Values] ORDER BY Rnd([Values]![ID]);

TOP N 在查询对象中不能是动态的。

可以计算组序列 ID 并在条件中使用它 return 每个 ID 组的记录数。这需要一个可以提供自动编号的唯一标识符字段。将其设置为随机,以便在将记录添加到数据集时选择可以不同。

考虑 SQL:

SELECT Values.PKID, Values.ID, Values.Test, Values.State, DCount("*","Values","ID=" & [Values].[ID] & " AND PKID<" & [PKID])+1 AS GrpSeq
FROM TestQ2 INNER JOIN [Values] ON TestQ2.ID = Values.ID
WHERE (((DCount("*","Values","ID=" & [Values].[ID] & " AND PKID<" & [PKID])+1)<=[TestQ2].[Test]));

但是,如果您确实需要 return 每个查询的随机记录集 运行,我预计将需要 VBA。用每个 ID 组的随机序列号填充值 table 中的字段,或者用随机数据集填充临时值 table。考虑 VBA 填充字段:

Sub RandomSeq()
Dim rs1 As DAO.Recordset, rs2 As DAO.Recordset, x As Integer
Set rs1 = CurrentDb.OpenRecordset("SELECT DISTINCT ID FROM [Values]")
Do While Not rs1.EOF
    Set rs2 = CurrentDb.OpenRecordset("SELECT * FROM [Values] WHERE ID=" & rs1!ID & " ORDER BY Rnd([ID]);")
    Do While Not rs2.EOF
        rs2.Edit
        x = x + 1
        rs2!GrpSeq = x
        rs2.Update
        rs2.MoveNext
    Loop
    rs2.Close
    x = 0
    rs1.MoveNext
Loop
End Sub

现在运行查询:

SELECT Values.ID, Values.Test, Values.State, Values.GrpSeq
FROM TestQ2 INNER JOIN [Values] ON TestQ2.ID = Values.ID
WHERE (((Values.GrpSeq)<=[TestQ2].[Test]));

请注意,这在具有多个并发用户的拆分数据库中不切实际。然后可能需要临时 table(位于前端)方法。