如何将数字与计数结果进行比较,然后在redshift / sql中的limit语句中使用它

时间:2018-07-24 21:01:24

标签: sql amazon-redshift

我有一个包含两列idflag的表。 数据非常不平衡。仅有少数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

2 个答案:

答案 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


如果我做出了错误的假设,请发表评论,然后重新调整答案。