Rob*_*ark 9 sql postgresql group-by aggregate-functions
鉴于:
table 'thing':
age
---
3.4
3.4
10.1
40
45
49
Run Code Online (Sandbox Code Playgroud)
我想计算每个10年范围内的事物数量,例如,
age_range | count
----------+-------
0 | 2
10| 1
20| 0
30| 0
40| 3
Run Code Online (Sandbox Code Playgroud)
此查询接近:
SELECT FLOOR(age / 10) as age_range, COUNT(*)
FROM thing
GROUP BY FLOOR(age / 10) ORDER BY FLOOR(age / 10);
Run Code Online (Sandbox Code Playgroud)
输出:
age_range | count
-----------+-------
0 | 1
1 | 2
4 | 3
Run Code Online (Sandbox Code Playgroud)
但是,它没有显示具有0计数的范围.如何修改查询以便它还显示0计数之间的范围?
我发现类似的堆栈流问题用于计数范围,一些用于0计数,但它们涉及必须指定每个范围(将范围硬编码到查询中,或将范围放在表中).我更喜欢使用如上所述的通用查询,我不必明确指定每个范围(例如,0-10,10-20,20-30,...).我正在使用PostgreSQL 9.1.3.
有没有办法修改上面的简单查询以包含0计数?
mu *_*ort 11
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
Run Code Online (Sandbox Code Playgroud)
generate_series通过单独的查询确定上限应该是微不足道的,我只使用10作为占位符.
这个:
generate_series(0, 10) s(d)
Run Code Online (Sandbox Code Playgroud)
实质上生成一个内联表,调用s单列d,其中包含0到10(含)的值.
如果需要,您可以将两个查询(一个用于计算范围,一个用于计算计数)包装到函数中.
| 归档时间: |
|
| 查看次数: |
11315 次 |
| 最近记录: |