首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何将一个数字与count结果进行比较,然后在redshift/sql的limit语句中使用它

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

Stack Overflow用户
提问于 2018-07-25 05:01:24
回答 2查看 59关注 0票数 0

我有一个包含两列idflag的表。数据非常不平衡。只有几个flag的值是1,其他的是0

代码语言:javascript
复制
id flag
1   0
2   0
3   0
4   0
5   1
6   1
7   0

现在我想创建一个平衡表。因此,我希望根据flag = 1所在位置的记录数从flag = 0中获取一个子集。另外,我不希望这个数字大于1000。

我正在考虑这样的代码:

代码语言:javascript
复制
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条):

代码语言:javascript
复制
id flag
2   0
7   0
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-07-25 05:15:42

如果你想要一个平衡的样本:

代码语言:javascript
复制
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;

您可以将其更改为:

代码语言:javascript
复制
where seqnum <= least(cnt_1, 1000)

如果你想要一个总体最大值。

票数 1
EN

Stack Overflow用户

发布于 2018-07-25 05:10:28

您可以使用row_number来模拟LIMIT。

代码语言:javascript
复制
select * from (
select column1, column2, row_number() OVER() AS rownum
from table
where flag = 0 )
where rownum < 1000

如果我做了一个糟糕的假设,请发表评论,我将重新关注我的答案。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51507474

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档