在 PostgreSQL 中,如何将一个 table 中的列与第二个 table 中的随机值组合?

In PostgreSQL, how to combine a column from one table with a random value from a second table?

我正在构建一个将各种人与家庭相关联的测试数据集,所有个人都有一个唯一的 ID,每个家庭(有多人)都有一个唯一的 ID。

我创建了 2 个 tables,每个人都拥有独特的 "peopleID" 价值观。第一个 table 具有唯一的 "familyID" 值。所以:

第一个 table ("people1") 看起来像这样:

person_ID | family_ID | first_name | last_name | date_of_birth |地址
1 | 1 |约翰 |史密斯 | 01-01-1901 |街 123 号
2 | 2 |简 |琼斯 | 1982 年 3 月 1 日 |任何地方大街 312 号
6 | 3 |哈罗德 |海盗 | 1973 年 6 月 30 日 |诺斯曼路 283 号

第二个 table (people2) 看起来像这样:

person_ID | family_ID | first_name | last_name | date_of_birth |地址
3 |空 |理查德 |霍金斯 | 04-20-2003 |空
4 |空 |朱丽叶 |乔丹 | 03-02-2005 |空

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

person_ID | family_ID | first_name | last_name | date_of_birth |地址
1 | 1 |约翰 |史密斯 | 01-01-1901 |街 123 号
2 | 2 |简 |琼斯 | 1982 年 3 月 1 日 |任何地方大街 312 号
6 | 3 |哈罗德 |海盗 | 1973 年 6 月 30 日 |诺斯曼路 283 号
3 | 2 |理查德 |霍金斯 | 04-20-2003 |空
4 | 3 |朱丽叶 |乔丹 | 03-02-2005 |空


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

SELECT person_ID, (select family_ID from people1 ORDER BY RANDOM() LIMIT 1) as family_ID from people2;

但是 return 是 "people2." 中每一行的来自 "people1" 的单个随机条目 我如何强制它为每一行 return 一个不同的随机值?遍历 "people2" 中的每一行并从 "people1," 中选择不同的 familyID 值的游标?怎么写?

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

SELECT FLOOR(RAND()*(b-a)+a)

其中 a 是范围内最小的数字,b 是范围内最大的数字。

(不过,我认为 RANDOM() 可能是 Postgresql 的函数,而不是 RAND())

因此,如果您的 people1.family_ID 列是一个 INT 列并且范围内没有缺失值(您给出的示例有效,因为它有 1,2,3),您可以尝试替换 aMIN(family_ID)bMAX(family_ID)

http://www.techonthenet.com/sql_server/functions/rand.php

  1. 创建一个临时的 table,它将为每个 family_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;
    
  2. 通过选择随机 no 关联随机 family_id
    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;
    

未测试