如何从postgres中的n个随机组中选择所有行

时间:2017-10-03 04:41:58

标签: sql postgresql sampling

此问题适用于在PostgreSQL中制定查询 假设我有下表:

record   entity   docid   sentencid   
1   A   123   1231   
1   A   123   1232
1   A   100   1001
1   C   100   1002
1   B   121   1212
1   B   123   1234
2   B   102   1021
2   D   111   1111
2   D   102   1022
2   E   101   1011   
3   C   111   1115
3   C   111   1113
3   C   111   1114

是否有PostgresSQL个查询可用于为此表中的每个记录选择n个(或更少)随机实体组的所有行?假设n为2.因此查询应选择记录3的所有行以及记录1和2的任意2个随机实体组的所有行。最终结果应按accessionentity排序, docidsentenceid

以下是n = 2的示例结果:

record   entity   docid   sentencid   
1   A   100   1001
1   A   123   1231   
1   A   123   1232
1   B   121   1212
1   B   123   1234
2   D   102   1022
2   D   111   1111
2   E   101   1011   
3   C   111   1113
3   C   111   1114
3   C   111   1115

假设实体A和B是从记录1的实体集合(A,B,C)中随机选择的,并且实体D和E是从实体集合(B,D,E)中随机选择的记录2.应为每条记录随机选择n个实体。

我已经广泛搜索了这个问题的答案,但没有找到任何有效的查询。感谢您对此进行调查!

1 个答案:

答案 0 :(得分:1)

您可以row_number使用random()订单随机选择每个n群组的record个实体。然后将其加入主表

select * from Table1 t1
join (
    select * from (
        select record, entity,
            row_number() over (partition by record order by random()) rn
        from Table1
        group by record, entity
    ) t where rn <= 2
) t2 on t1.record = t2.record and t1.entity = t2.entity

Demo