如何在一系列数字之间添加行并使它们的值为0

ct3nt3jp  于 2021-07-24  发布在  Java
关注(0)|答案(2)|浏览(331)

我正在使用的sql查询
表中的结果
我要做的是,我不想只在num\u opens实际计数的地方有值,我想让它显示所有潜在的num\u opens值,介于最小值和最大值之间,它们的总和为0。例如,在照片中,我们看到一个跳跃之间
打开次数:7总计:1
打开次数:10,总计:1
但我希望是这样
打开次数:7总计:1
打开次数:8总计:0
打开次数:9总计:0
打开次数:10,总计:1
同样地,对于所有潜在的numè,打开最小值和最大值之间的值(11-15,15-31,31-48)。这是很棘手的,因为每天的最大值可能是不同的(今天的最大值是48,但明天可能是37),所以我需要拉最大值不知何故。
谢谢您!

bkhjykvo

bkhjykvo1#

你可以用 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;
vjhs03f7

vjhs03f72#

首先需要一个参考表。从你的照片上可以看出 users ,但实际上任何一张(足够大的)table都可以。
首先,您将使用 rank() 或者 row_count() 功能。或者如果你的 users.id 没有空隙,使用起来更容易。 SELECT *, rank() OVER (ORDER BY id) as reference_value FROM users 这将生成一个表 1....n 为了 users .
现在加入到该表中,但从加入的表中计数:

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

相关问题