在 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),您可以尝试替换 a 与 MIN(family_ID)
和 b 与 MAX(family_ID)
- 创建一个临时的 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;
- 通过选择随机
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;
未测试
我正在构建一个将各种人与家庭相关联的测试数据集,所有个人都有一个唯一的 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),您可以尝试替换 a 与 MIN(family_ID)
和 b 与 MAX(family_ID)
- 创建一个临时的 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;
- 通过选择随机
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;
未测试