在PostgreSQL中,如何将一个表中的列与另一个表中的随机值组合起来?

在PostgreSQL中,如何将一个表中的列与另一个表中的随机值组合起来?,sql,database,postgresql,select,random,Sql,Database,Postgresql,Select,Random,我正在构建一个测试数据集,将不同的人与家庭关联起来,所有个人都有一个唯一的ID,每个有多个人的家庭都有一个唯一的ID 我创建了两个表,每个表中的人都有唯一的peopleID值。第一个表具有唯一的familyID值。因此: 第一个表people1如下所示: 人名|家庭|身份|名|姓|日期|出生|地址 1 | 1 |约翰|史密斯| 01-01-1901 | 123 Anywhere St 2 | 2 |简|琼斯| 03-01-1982 |任何地方大道312号 6 | 3 |哈罗德|维京人| 06-

我正在构建一个测试数据集,将不同的人与家庭关联起来,所有个人都有一个唯一的ID,每个有多个人的家庭都有一个唯一的ID

我创建了两个表,每个表中的人都有唯一的peopleID值。第一个表具有唯一的familyID值。因此:

第一个表people1如下所示:

人名|家庭|身份|名|姓|日期|出生|地址 1 | 1 |约翰|史密斯| 01-01-1901 | 123 Anywhere St 2 | 2 |简|琼斯| 03-01-1982 |任何地方大道312号 6 | 3 |哈罗德|维京人| 06-30-1973 |诺思曼路283号

第二张表people2如下所示:

人名|家庭|身份|名|姓|日期|出生|地址 3 |空|理查德|霍金斯| 04-20-2003 |空 4 |空|朱丽叶|约旦| 03-02-2005 |空

我想将people2中的行添加到people1中,每个行都有一个来自people1的随机familyID,因此最终结果如下所示:

人名|家庭|身份|名|姓|日期|出生|地址 1 | 1 |约翰|史密斯| 01-01-1901 | 123 Anywhere St 2 | 2 |简|琼斯| 03-01-1982 |任何地方大道312号 6 | 3 |哈罗德|维京人| 06-30-1973 |诺思曼路283号 3 | 2 |理查德|霍金斯| 04-20-2003 |零 4 | 3 |朱丽叶|约旦| 03-02-2005 |零

我想到的一种方法是从第二个表构建一个引用表,如下所示:

选择人员ID, 按随机限制1从people1 ORDER中选择family_ID作为family_ID 来自人民2


但这会从people1中为people2中的每一行返回一个随机条目。如何强制它为每一行返回不同的随机值?在people2中的每一行中迭代并从people1中选择不同familyID值的游标,也许?如何编写?

用于生成范围内任意随机整数的SQL Server公式为:

SELECT FLOOR(RAND()*(b-a)+a)
其中a是该范围内的最小值,b是该范围内的最大值

然而,我相信RANDOM可能是Postgresql的函数,而不是RAND

因此,如果people1.family_ID列是一个INT列,并且示例中给出的范围内没有缺失值,因为它有1,2,3,那么可以尝试用MINfamily_ID替换a,用MAXfamily_ID替换b

创建一个临时表,将后续编号与每个族id关联:


未经测试

很好。事实上,就在你发帖的时候,我到了那里。这样就可以联接表。谢谢 create temporary table family_id_no( no serial primary key, family_id int); insert into family_id_no(family_id) select distinct family_id from people1; select person_id, family_id_no.family_id, first_name, last_name, date_of_birth, address from people2 left join family_id_no using no=trunc(random()*(select max(no) from family_id_no))+1;