Mysql SQL-如何在一系列数字之间添加行并使其值为0

Mysql SQL-如何在一系列数字之间添加行并使其值为0,mysql,sql,google-bigquery,Mysql,Sql,Google Bigquery,我试图实现的是,我希望它显示最小值和最大值之间的所有可能的num_opens值,并且它们的总数为0,而不是仅计算num_opens的实际计数位置的值。例如,在照片中,我们看到一个跳跃 打开数量:7个总计:1个 打开数量:10个总计:1个 但我希望是这样 打开数量:7个总计:1个 打开数量:8总计:0 打开数量:9总计:0 打开数量:10个总计:1个 同样地,对于所有潜在的num_,打开值介于最小值和最大值11-15,15-31,31-48之间。这很棘手,因为每天的最大值可能不同,今天最大值是48

我试图实现的是,我希望它显示最小值和最大值之间的所有可能的num_opens值,并且它们的总数为0,而不是仅计算num_opens的实际计数位置的值。例如,在照片中,我们看到一个跳跃

打开数量:7个总计:1个

打开数量:10个总计:1个

但我希望是这样

打开数量:7个总计:1个

打开数量:8总计:0

打开数量:9总计:0

打开数量:10个总计:1个

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


谢谢大家!

首先需要一个参考表。从您的图片中可以看到一些称为用户的东西,但实际上任何足够大的表都可以

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

选择*,按id排序,作为用户的参考值

这将为用户生成表1…n

现在,您加入到该表中,但从加入表中计算:

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
但是这行太多了!你肯定有比这些事件计数更多的用户。所以在那里放一个快速过滤器

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
您可以使用generate_array和unnest:


这太完美了。非常感谢你!!
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;