SQL频率分布查询,用于对具有group by且包含0计数的范围进行计数

SQL频率分布查询,用于对具有group by且包含0计数的范围进行计数,sql,postgresql,group-by,aggregate-functions,Sql,Postgresql,Group By,Aggregate Functions,鉴于: 我想计算每10年范围内的物品数量,例如 table 'thing': age --- 3.4 3.4 10.1 40 45 49 此查询很接近: age_range | count ----------+------- 0 | 2 10| 1 20| 0 30| 0 40| 3 输出: SELECT FLOOR(age / 10) as age_range, CO

鉴于:

我想计算每10年范围内的物品数量,例如

table 'thing':

age
---
3.4
3.4
10.1
40
45
49
此查询很接近:

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);
但是,它没有显示计数为0的范围。如何修改查询,使其同时显示0个计数之间的范围

我发现计数范围存在类似的stackoverflow问题,有些是0计数,但它们涉及到必须指定每个范围,或者将范围硬编码到查询中,或者将范围放入表中。我更愿意使用像上面那样的通用查询,其中我不必显式地指定每个范围,例如,0-10、10-20、20-30等等。。。。我正在使用PostgreSQL 9.1.3

有没有办法修改上面的简单查询以包含0个计数

类似的:

救援:

 age_range | count 
-----------+-------
         0 |     1
         1 |     2
         4 |     3
用一个单独的查询来计算generate_系列的上限应该很简单,我只是用10作为占位符

这:

实际上,生成一个名为s的内联表,其中包含一列d,其中包含0到10(包括0到10)的值


您可以将两个查询包装起来,一个用于计算范围,另一个用于在必要时将计数计算到函数中。

您需要某种方法来创建年龄范围表。行号通常工作得很好。对一张大桌子做笛卡尔积,得到很多数字

generate_series(0, 10) s(d)

编辑:mu太短了,有一个更优雅的答案,但是如果db上没有generate_series函数,…:

那很好。知道的功能很好。优雅的回答,@mu_太短了!我试过了,它成功了。这正是我想要的。谢谢@格伦:是的,generate_系列非常有用,它还可以处理时间戳,所以再见日历表。
generate_series(0, 10) s(d)
WITH RANGES AS (
SELECT (rownum - 1) * 10 AS age_range
  FROM ( SELECT row_number() OVER() as rownum
           FROM pg_tables
       ) n
      ,( SELECT ceil( max(age) / 10 )  range_end
           FROM thing
       ) m
  WHERE  n. rownum <= range_end
)
SELECT r.age_range, COUNT(t.age) AS count
  FROM ranges r
  LEFT JOIN thing t ON r.age_range = FLOOR(t.age / 10) * 10
  GROUP BY r.age_range
  ORDER BY r.age_range;