首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SQL -如何在数字范围之间添加行并使其值为0

SQL -如何在数字范围之间添加行并使其值为0
EN

Stack Overflow用户
提问于 2020-08-04 23:16:10
回答 2查看 239关注 0票数 0

我正在处理的SQL查询

表中的结果

我想要实现的是,不只是拥有实际计算num_opens的地方的值,我希望让它显示最小值和最大值之间的所有潜在的num_opens值,并且它们的总数为0。例如,在照片中我们看到

num_opens: 7共计:1

num_opens: 10共计:1

,但我希望是

num_opens: 7共计:1

num_opens: 8共计:0

num_opens: 9共计:0

num_opens: 10共计:1

同样,对于最小和最大值之间的所有潜在num_opens值(11-15,15-31,31-48)。这很棘手,因为每天的最大值可能是不同的(今天的最大值是48,明天可能是37),所以我需要以某种方式提取最大值。

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-08-05 01:04:23

您可以使用generate_array()unnest()

代码语言:javascript
运行
复制
select num_opens, count(t.num_opens)
from (select min(num_opens) as min_no, max(num_opens) as max_no
      from t
     ) x cross join
     unnest(generate_array(t.min_no, t.max_no)) num_opens left join
     t
     on t.num_opens = num_opens
group by num_opens;
票数 1
EN

Stack Overflow用户

发布于 2020-08-05 00:24:56

首先需要一个参考表。从图片上看,您有一个名为users的东西,但是任何(足够大的)表都可以。

因此,首先,您将使用rank()row_count()函数构建引用表。或者,如果您的users.id没有漏洞,那么使用它就更容易了。

SELECT *, rank() OVER (ORDER BY id) as reference_value FROM users

这将为users生成一个表users

现在,您可以加入到其中,但是从表中的联接中计算:

代码语言:javascript
运行
复制
SELECT 
    a.reference_value, count(b.num_opens) as total
FROM   
     (SELECT rank() OVER (ORDER BY id) as reference_value from users) a
LEFT JOIN 
     [whatever table] b ON a.reference_value = b.num_opens
GROUP BY 
   a.reference_value

但这行太多了!您的用户肯定比这些事件数量还多。所以在里面放个快速过滤器。

代码语言:javascript
运行
复制
SELECT 
    a.reference_value, count(b.num_opens) as total
FROM   
     (SELECT rank() OVER (ORDER BY id) as reference_value from users) a
LEFT JOIN 
     [whatever table] b ON a.reference_value = b.num_opens
WHERE
     a.reference_value <= (SELECT max(num_opens) FROM [whatever table])
GROUP BY 
   a.reference_value
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63256296

复制
相关文章

相似问题

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