width_bucket没有返回空桶

时间:2016-12-06 01:07:56

标签: sql postgresql

在postgres 9.5.3中,如果没有值来填充某些存储桶,则width_bucket()返回的数量少于指定数量的存储桶。有没有办法让这些空桶出现?

CREATE TEMP TABLE metrics (val INT);
INSERT INTO metrics (val) VALUES(1), (2), (3), (8), (10);
SELECT width_bucket(val, 1, 10, 9) FROM metrics;

返回:

width_bucket
------------
           1
           2
           3
           8
          10

1 个答案:

答案 0 :(得分:3)

width_bucket()并不完全返回所有存储桶。它返回分配每个值的存储桶。如果没有为存储桶分配值,则不会返回该存储桶值。

它不会丢失桶。存储桶中根本没有数据。

如果要计算存储桶的大小 - 并包含所有存储桶 - 然后使用generate_series()生成存储桶:

SELECT g.n, COUNT(m.val) 
FROM generate_series(1, 10) g(n) LEFT JOIN
     metrics m 
     ON width_bucket(val, 1, 10, 9) = g.n
GROUP BY g.n
ORDER BY g.n;