我目前正在生成随机数据,不知道如何完成这一部分。我有两张桌子。我有一个实体表和一个组表。两个表都有一个唯一的标识符(guid(。我的目标是创建一个将实体X次匹配到单个组的表映射。
例如,假设我有10k个实体和100个组,我想创建1k个映射。我需要为每个组创建10个映射(1000/100(。我可以继续创建一个while循环,只得到10个随机实体,但这并不有效,我希望避免这种情况。我还考虑过交叉连接,然后将结果减少到1k,但我希望每个组都有完全相同数量的映射。
有没有任何方法可以通过一个查询来实现这一点?
这里有一个例子,假设我有这个Group table
和Entity Table
+---------+
| GroupId |
+---------+
| G1 |
| G2 |
| G3 |
+---------+
+----------+
| EntityId |
+----------+
| E1 |
| E2 |
| E3 |
| E4 |
| E5 |
| E6 |
| E7 |
| E8 |
| E9 |
| E10 |
+----------+
I would like to get 6 mappings (so each group needs 2 mappings). Here is an example of what I could get:
+---------+----------+
| GroupId | EntityId |
+---------+----------+
| G1 | E2 |
| G1 | E4 |
| G2 | E9 |
| G2 | E10 |
| G3 | E2 |
| G3 | E5 |
+---------+----------+
这听起来对NTILE很有用。
首先在Groups
表上使用ROW_NUMBER((生成顺序";组号";(对于相对的随机顺序,按NewID((排序(:
GroupId|GroupNum:--------|-------:G3|1G2|2G1|3
然后使用NTILE((将Entity
行分配到所需数量的组中:
E1|GroupNum:-|-------:E2|1E10|1E3|1E4|1E1|2E6|2E5|2E7|3E8|3E9|3
最后将结果在";组号":
SQL:
DECLARE @NumOfGroups INT; SET @NumOfGroups = ( SELECT COUNT(*) FROM Groups ); SELECT e.[E1], g.GroupId FROM ( SELECT *, NTILE(@NumOfGroups) OVER(ORDER BY NEWID()) AS GroupNum FROM Entities ) AS e INNER JOIN ( SELECT *, ROW_NUMBER() OVER(ORDER BY NEWID()) AS GroupNum FROM Groups ) AS g ON g.GroupNum = e.GroupNum ORDER BY e.GroupNum, e.E1 GO
结果:
E1 | GroupId |
---|---|
E1 | G1 |
E3 | G1 |
E5 | |
E8 | G1 |
E2 | G3 |
E7 | G3 |
E9 | G3 |
E4 | G2 |
E6 | G2 |