Ms access 从表中随机选择记录,但不超过2条同名记录

Ms access 从表中随机选择记录,但不超过2条同名记录,ms-access,Ms Access,我想从表中获取TOP N随机记录,但相同名称的记录不超过2条 SELECT TOP 7 Table1.ID, Table1.Name, Table1.Salary, Rnd(Abs([Table1]![id])) AS Expr1 FROM Table1 GROUP BY Table1.ID, Table1.Name, Table1.Salary, Rnd(Abs([Table1]![id])) ORDER BY Rnd(Abs([Table1]![id])); 它为同一个名字提供了两个以上的

我想从表中获取
TOP N
随机记录,但相同名称的记录不超过2条

SELECT TOP 7 Table1.ID, Table1.Name, Table1.Salary, Rnd(Abs([Table1]![id])) AS Expr1
FROM Table1
GROUP BY Table1.ID, Table1.Name, Table1.Salary, Rnd(Abs([Table1]![id]))
ORDER BY Rnd(Abs([Table1]![id]));
它为同一个名字提供了两个以上的记录。请有人提供一些帮助。

使用此查询:

选择
身份证件
[姓名]
从…起
[表一]
订购人
Rnd(-Timer()*[ID]);
然后将其作为记录集打开,并从开始和拾取ID(可以保存在数组中)遍历它,同时记录所使用的名称(可以使用集合)

如果某个名称已使用两次,请跳过该记录并移动到下一个

选择了七个ID后,停止。ID数组将识别您的七条记录

将查询另存为RandomAll。然后在此函数中使用它:

公共函数RandomTwo()与long()相同
Dim rs作为DAO.Recordset
将名称设置为新集合
Dim用作整数
将索引设置为整数
Dim id()的长度相同
Set rs=CurrentDb.OpenRecordset(“RandomAll”)
重拨ID(0)
做而不做
已使用=0
”伯爵说道。如果不使用,将失败。
出错时继续下一步
Used=Val(name.Item(rs.Fields(1.Value))
错误转到0
调试。使用打印;
如果使用=1,则
'删除密钥,稍后添加更新的使用计数。
名称.删除rs.Fields(1).Value
如果结束
如果使用小于2,则
'记录键的使用计数(作为文本)。
名称。添加CStr(已使用+1),rs.Fields(1)。值
调试。打印rs!ID.值,rs.字段(1).值
'将ID添加到数组。
Ids(UBound(Ids))=rs!ID.值
如果UBound(Ids)=6,则
“找到了七个身份证。
退出Do
其他的
'准备下一个ID。
重拨保留ID(UBound(ID)+1)
如果结束
如果结束
下一个
环
rs.Close
'列出找到的ID。
对于索引=LBound(Ids)到UBound(Ids)
打印索引,ID(索引)
下一个
'返回ID。
随机数2=Ids
端函数

该函数将返回包含七个ID的数组。

从Gustav的答案中汲取灵感,我设计了一段VBA代码,它将生成一个SQL字符串,当使用该字符串时,将为您提供
N
数量的随机记录,每个名称的限制为2

Const PicksLimit As Long=7'要选择多少条记录
Dim rs作为DAO.Recordset
'选择随机表
Set rs=CurrentDb.OpenRecordset(“按Rnd(Abs(ID))从表1中选择ID、名称”)
'定义用于跟踪拾取ID的变量
Dim选择长度,选择名称为字符串,选择SQL为字符串
拾取=0
PickNames=“”
PicksSQL=“”
用rs
如果不是(.BOF和.EOF),则“如果表不为空。。。
.先走一步
'循环,直到达到极限或完全看穿表格
直到Picks=PicksLimit或.EOF
'如果之前选择的名称少于两次
如果Len(PickNames)-Len(Replace(PickNames,“[”&!Name&“]”,“)<((Len(!Name)+2)*2),则
拾取=拾取+1'增量计数器
PickNames=PickNames&“[”&!Name&“]”为以后的检查添加名称
picksql=picksql&“ID=”&!Id&“或””追加SQL字符串
如果结束
.下一步
环
'添加前端sql节并删除最后一个或
picksql=“从表1中选择*,其中”&左侧(picksql,Len(picksql)-4)
其他的
'如果表为空,则无需进行ID检查
picksql=“从表1中选择*”
如果结束
以
rs.Close
设置rs=无
'打印SQL字符串(可以将其更改为设置记录源或类似内容
Debug.Print(PicksSQL)
目前,SQL字符串只是打印到即时窗口中,但可以将其更改到任何需要的地方,例如子窗体的RecordSource


每次你想要一个新的随机列表时,都需要运行代码,但这不会花费太多时间,所以我不认为这是一个太大的问题。

这看起来不像t-SQL。
不是对象分隔符,
RND
不是该语言中的函数。你使用的是SQL Server还是(MS?)访问这里?请适当地更新您的标签可能…您能给我们一个这个将使用的数据样本吗?嗨,佩赫,我正试图在MS Access中实现这一点感谢代码Gustav,它提供了随机选择,但我仍然获得了两个以上相同名称的记录…我如何在Access中使用数组和集合…您能提供帮助吗告诉我如果你需要帮助将代码集成到你正在做的任何事情中,请告诉我。实际上,尝试理解这个outHi Taazar是一件很有趣的事情,它从表1中给出select*,其中id=1或id=2等等。如果我有多个列,但名称不应超过2Umesh Yadav,多个列不会影响它。它选择所有列umns在表中显示,原因ID是唯一命名的列,因为它是唯一需要筛选器的列。