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

时间:2015-02-09 16:55:37

标签: sql database postgresql select random

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

我创建了2个表,每个表都包含具有唯一“peopleID”值的人员。第一个表具有唯一的“familyID”值。所以:

第一个表(“people1”)如下所示:

person_ID | family_ID | first_name | last_name | date_of_birth |解决
1 | 1 |约翰|史密斯| 01-01-1901 | 123 Anywhere St
2 | 2 |简|琼斯| 03-01-1982 | 312 Anyplace Ave
6 | 3 |哈罗德|维京人| 06-30-1973 | 283 Northman Rd

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

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

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

person_ID | family_ID | first_name | last_name | date_of_birth |解决
1 | 1 |约翰|史密斯| 01-01-1901 | 123 Anywhere St
2 | 2 |简|琼斯| 03-01-1982 | 312 Anyplace Ave
6 | 3 |哈罗德|维京人| 06-30-1973 | 283 Northman Rd
3 | 2 |理查德|霍金斯| 04-20-2003 | NULL
4 | 3 |朱丽叶|乔丹| 03-02-2005 | NULL


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

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

但是,对于“people2”中的每一行,它会从“people1”返回一个随机条目。我怎么能强迫它为每一行返回一个不同的随机值?一个游标迭代“people2”中的每一行,并从“people1”中选择一个不同的familyID值?怎么会写?

2 个答案:

答案 0 :(得分:0)

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

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)

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

答案 1 :(得分:0)

  1. 创建一个临时表,将后续号码与每个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. 通过选择随机family_id来关联随机no
    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;
    

未测试