SQL频率分布查询以group-by计算范围并包括0计数
发布时间:2020-12-12 06:30:03 所属栏目:MsSql教程 来源:网络整理
导读:鉴于: table 'thing':age---3.43.410.1404549 我想计算每个10年范围内的事物数量,例如, age_range | count----------+------- 0 | 2 10| 1 20| 0 30| 0 40| 3 这个查询很接近: SELECT FLOOR(age / 10) as age_range,COUNT(*)FROM thingGROUP BY FLOOR(age /
鉴于:
table 'thing': age --- 3.4 3.4 10.1 40 45 49 我想计算每个10年范围内的事物数量,例如, age_range | count ----------+------- 0 | 2 10| 1 20| 0 30| 0 40| 3 这个查询很接近: SELECT FLOOR(age / 10) as age_range,COUNT(*) FROM thing GROUP BY FLOOR(age / 10) ORDER BY FLOOR(age / 10); 输出: age_range | count -----------+------- 0 | 1 1 | 2 4 | 3 但是,它没有显示具有0计数的范围.如何修改查询以便它还显示0计数之间的范围? 我发现类似的堆栈溢出问题用于计数范围,一些用于0计数,但它们涉及必须指定每个范围(将范围硬编码到查询中,或将范围放在表中).我更喜欢使用如上所述的通用查询,我不必明确指定每个范围(例如,0-10,10-20,20-30,…).我正在使用PostgreSQL 9.1.3. 有没有办法修改上面的简单查询以包含0计数? 类似: 解决方法generate_series 救援:
select 10 * s.d,count(t.age) from generate_series(0,10) s(d) left outer join thing t on s.d = floor(t.age / 10) group by s.d order by s.d 通过单独的查询确定generate_series的上限应该是微不足道的,我只使用10作为占位符. 这个: generate_series(0,10) s(d) 实质上生成一个名为s的内联表,其中包含单个列d,其中包含0到10(含)的值. 如果需要,您可以将两个查询(一个用于计算范围,一个用于计算计数)包装到函数中. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |