我有一个包含两列id
和flag
的表。
数据非常不平衡。仅有少数flag
的值为1
,其他的值为0
。
id flag
1 0
2 0
3 0
4 0
5 1
6 1
7 0
现在,我想创建一个平衡表。因此,我想根据flag = 0
的记录数从flag = 1
获取一个子集。另外,我不希望这个数字大于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
答案 0 :(得分:1)
如果您想要平衡的样品:
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)
如果您想要一个整体最大值。
答案 1 :(得分:0)
您可以使用row_number模拟LIMIT。
var message = "" per var rateValue:Double = 0.0 and replaced
如果我做出了错误的假设,请发表评论,然后重新调整答案。