基于postgres中的列类别的分层抽样

时间:2015-12-02 02:47:58

标签: sql postgresql

我有一个大约有280K观测值的数据集。但是,该观察的大部分属于列的一个特定值。这是计数

Category    Count
A   8981
B   6146
C   243369
D   10678
F   4431
G   2421
H   1009
I   7948

如果你看到C类有243K这样的记录而有些则非常。我想以这样一种方式对数据进行下采样,即保留其他类别值的所有记录,同时仅保留“C”类中随机记录的一定百分比。比如大概10%左右。通过这种方式,我可以在所有这些类别中正确分配数据。

如何在postgres中实现这一目标?

1 个答案:

答案 0 :(得分:1)

查询从表中选择一个随机行,其中只包含10%的category C行和所有包含其他类别的行:

select *
from (
    (select *
    from observations
    where category = 'C'
    order by random()
    limit 243369* 0.1)
    union
    (select *
    from observations
    where category <> 'C')
    ) sub
order by random()
limit 1;