width_bucket 不返回等宽的桶

Posted

技术标签:

【中文标题】width_bucket 不返回等宽的桶【英文标题】:width_bucket not returning buckets of equal width 【发布时间】:2018-06-28 20:57:24 【问题描述】:

我正在使用 Postgres 版本 9.6.9 并尝试使用 width_bucket() 生成包含相等宽度的桶的直方图。但是,我使用的查询没有返回等宽的桶。

正如您在下面的示例中所见,存储桶中的值具有不同的宽度。例如桶 1 的最小值为 7,最大值为 18 - 宽度为 11。桶 3 的最小值为 52,最大值为 55 - 宽度为 3。

如何调整我的查询以确保每个存储桶具有相同的宽度?

数据如下所示:

 value
-------
 7
 7
15
17
18
22
23
25
29
42
52
52
55
60
74
85
90
90
92
95

(20 行)

这是查询和生成的直方图:

WITH min_max AS (
    SELECT 
        min(value) AS min_val,
        max(value) AS max_val
    FROM table
) 
SELECT 
    min(value),
    max(value),
    count(*),
    width_bucket(value, min_val, max_val, 5) AS bucket
FROM table, min_max  
GROUP BY bucket 
ORDER BY bucket;

 min | max | count | bucket
-----+-----+-------+--------
   7 |  23 |     7 |      1
  25 |  42 |     3 |      2
  52 |  55 |     3 |      3
  60 |  74 |     2 |      4
  85 |  92 |     4 |      5
  95 |  95 |     1 |      6
 ( 6 rows )

【问题讨论】:

【参考方案1】:

您的存储桶大小相同。您只是没有准确表示端点的数据。

例如,24 会在第一个或第二个存储桶中吗?这对于没有任何数据的范围更为显着,例如 75-83。

【讨论】:

【参考方案2】:

来自https://www.oreilly.com/library/view/sql-in-a/9780596155322/re91.html

WIDTH_BUCKET( expression, min, max, buckets)

buckets 参数指定要在 min 到 max 定义的范围内创建的桶数。 min 包含在内,而 max 不包含

不包括最大值。就这样设置

    WIDTH_BUCKET( expression, min, max + 1, buckets)

【讨论】:

以上是关于width_bucket 不返回等宽的桶的主要内容,如果未能解决你的问题,请参考以下文章

Buck电路工作原理

Nuclide C++ 简单的 Buck 配置

T37302 P哥的桶

Buck vs Gradle,Android 构建系统的优缺点

BUCK电路是怎么演变过来的

瀑布流布局(等宽不等高)