在postgresql中对计数进行分层随机抽样

时间:2017-01-18 00:52:30

标签: sql postgresql random

我有calculate_table()程序生成的下表:

table(
  id integer,
  type integer
)

我希望做一个分层的随机样本,我选择一个随机的id,按类型随机化,并返回id的类型和计数的计数。

所以在下面的例子中:

id,type
1,1
2,1
3,1
4,1
5,2
6,2
7,2
8,3
9,4

随机化可以选择以下内容:

chosen_type: 2
type_count: 4
chosen_id: 6
id_count: 3

因此,有25%的机会获得2型,如果选择2型,则有33%获得ID 6。

以下是不行的,因为它是从所有id中随机选择的,与其类型无关,这不是我想要的。

select * from calculate_table()
order by random()
limit 1;

我无法避免多次调用calculate_table()过程和/或将数据存储在数组中。我怎么能这样做呢?

2 个答案:

答案 0 :(得分:2)

extern

答案 1 :(得分:0)

您可以使用随机()排序的窗口函数来实现此目的。

有关示例,请参阅this SQLfiddle

select  *
from   (
        select  type,
                row_number() over( order by random() ) as type_random,
                id, 
                row_number() over( partition by type order by random() ) as id_random
        from    calculate_table()
       ) as a
 where   type_random = 1
         and id_random = 1