如何根据查询结果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(位于前端)方法。
我有一个 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(位于前端)方法。