我有一个包含两列id
和flag
的表。数据非常不平衡。只有几个flag
的值是1
,其他的是0
。
id flag
1 0
2 0
3 0
4 0
5 1
6 1
7 0
现在我想创建一个平衡表。因此,我希望根据flag = 1
所在位置的记录数从flag = 0
中获取一个子集。另外,我不希望这个数字大于1000。
我正在考虑这样的代码:
select *
from table
where flag = 0
order by random()
limit (least(1000,
select count(*)
from table
where flag = 1));
预期结果(只有两条记录的flag
为1,所以我得到两条flag
为0的记录,如果有1000条以上的记录flag
为1,我只会得到1000条):
id flag
2 0
7 0
发布于 2018-07-25 05:15:42
如果你想要一个平衡的样本:
select t.*
from (select t.*, row_number() over (partition by flag order by flag) as seqnum,
sum(case when flag = 1 then 1 else 0 end) over () as cnt_1
from t
) t
where seqnum <= cnt_1;
您可以将其更改为:
where seqnum <= least(cnt_1, 1000)
如果你想要一个总体最大值。
发布于 2018-07-25 05:10:28
您可以使用row_number来模拟LIMIT。
select * from (
select column1, column2, row_number() OVER() AS rownum
from table
where flag = 0 )
where rownum < 1000
如果我做了一个糟糕的假设,请发表评论,我将重新关注我的答案。
https://stackoverflow.com/questions/51507474
复制相似问题