我想要实现的是,不只是拥有实际计算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),所以我需要以某种方式提取最大值。
谢谢!
发布于 2020-08-05 01:04:23
您可以使用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;发布于 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。
现在,您可以加入到其中,但是从表中的联接中计算:
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_valuehttps://stackoverflow.com/questions/63256296
复制相似问题