从第二个表中为一组用户选择 SQL 表中均匀分布的记录?

问题描述

我在 sql Server 中有一个包含用户活动的大表(表 A)和另一个包含用户列表的表(表 B)。

我需要遍历活动表并对每个用户进行序列化选择,并将新记录放入第三个表(表 C)中。

换句话说,对于表B中的每个用户,我需要从表A中获取1条匹配的记录,并将它们放入新的表C中,重复整个过程,直到每个人都得到x条记录。

最终的结果是,我可以在表 C 中得到一个分布式记录集,其中每个用户都被平等地代表。

解决方法

您可以使用窗口函数或横向连接。让我们做横向连接。如果您希望为每个用户随机选择记录:

select a.*
from b cross apply
     (select top (x) a.*
      from a
      where a.user_id = b.user_id
      order by newid()
     ) a;

当然,如果a中没有足够的记录,那么有些用户的记录会更少。