将一个表中特定数量的行连接到另一个表的单行



我目前正在生成随机数据,不知道如何完成这一部分。我有两张桌子。我有一个实体表和一个组表。两个表都有一个唯一的标识符(guid(。我的目标是创建一个将实体X次匹配到单个组的表映射。

例如,假设我有10k个实体和100个组,我想创建1k个映射。我需要为每个组创建10个映射(1000/100(。我可以继续创建一个while循环,只得到10个随机实体,但这并不有效,我希望避免这种情况。我还考虑过交叉连接,然后将结果减少到1k,但我希望每个组都有完全相同数量的映射。

有没有任何方法可以通过一个查询来实现这一点?

这里有一个例子,假设我有这个Group tableEntity 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

结果:

E10
E1 GroupId
E1 G1
E3 G1
E5
E8 G1
E2 G3
E7 G3
E9 G3
E4G2
E6G2

最新更新