PostgreSQL 9.5新特性 width_bucket求位置插值,可展示柱状图-阿里云开发者社区

开发者社区> 阿里云数据库> 正文

PostgreSQL 9.5新特性 width_bucket求位置插值,可展示柱状图

简介:
PostgreSQL 9.5 新增的一个函数width_bucket , 用来计算一个值在一个bucket范围内的位置信息,如果这个值超出了给定的范围,返回0或者总bucket+1。bucket除了用数字来表示,还可以直接用数组来表示。
width_bucket(operand dp,b1 dp, b2 dp, count int) int return the bucket number to which operand would be assigned in a histogram having count equal-width buckets spanning the range b1 to b2; returns 0 or count+1 for an input outside the range width_bucket(5.35, 0.024, 10.06, 5) 3
width_bucket(operandnumeric, b1 numeric, b2numeric, count int) int return the bucket number to which operand would be assigned in a histogram having count equal-width buckets spanning the range b1 to b2; returns 0 or count+1 for an input outside the range width_bucket(5.35, 0.024, 10.06, 5) 3
width_bucket(operandanyelement, thresholdsanyarray) int return the bucket number to which operand would be assigned given an array listing the lower bounds of the buckets; returns 0 for an input less than the first lower bound; the thresholds arraymust be sorted, smallest first, or unexpected results will be obtained width_bucket(now(), array['yesterday', 'today', 'tomorrow']::timestamptz[]) 2
例子:
0.0, 5.0是边界,其中包含0.0,但是不包含5.0, 最后一个参数表示一共分为5个bucket。
超出边界:

postgres=# select width_bucket(-1, 0.0, 5.0, 5);
 width_bucket 
--------------
            0
(1 row)
postgres=# select width_bucket(5.0, 0.0, 5.0, 5);
 width_bucket 
--------------
            6
(1 row)
postgres=# select width_bucket(-0.0000001, 0.0, 5.0, 5);
 width_bucket 
--------------
            0
(1 row)
postgres=# select width_bucket(5.1, 0.0, 5.0, 5);
 width_bucket 
--------------
            6
(1 row)


在边界内:

postgres=# select width_bucket(0, 0.0, 5.0, 5);
 width_bucket 
--------------
            1
(1 row)
postgres=# select width_bucket(1, 0.0, 5.0, 5);
 width_bucket 
--------------
            2
(1 row)
postgres=# select width_bucket(1.9, 0.0, 5.0, 5);
 width_bucket 
--------------
            2
(1 row)
postgres=# select width_bucket(1.9999999, 0.0, 5.0, 5);
 width_bucket 
--------------
            2
(1 row)
postgres=# select width_bucket(2, 0.0, 5.0, 5);
 width_bucket 
--------------
            3
(1 row)
postgres=# select width_bucket(4.9999, 0.0, 5.0, 5);
 width_bucket 
--------------
            5
(1 row)


直接使用数组代表边界:
注意参数类型必须一致。

postgres=# select width_bucket(now(), array['yesterday', 'today', 'tomorrow']::timestamptz[]);
 width_bucket 
--------------
            2
(1 row)
postgres=# select width_bucket(now(), array['yesterday', 'today', 'tomorrow']::timestamp[]);
ERROR:  function width_bucket(timestamp with time zone, timestamp without time zone[]) does not exist
LINE 1: select width_bucket(now(), array['yesterday', 'today', 'tomo...
               ^
HINT:  No function matches the given name and argument types. You might need to add explicit type casts.
postgres=# select width_bucket(1,'{0,1,100,200,300}'::int[]);
 width_bucket 
--------------
            2
(1 row)

边界表示如下,所以1落在第二个bucket
[0,1)
[1,100)
[100,200)
[200,300)


[参考]
1. http://www.postgresql.org/docs/devel/static/functions-math.html#FUNCTIONS-MATH-FUNC-TABLE

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
阿里云数据库
使用钉钉扫一扫加入圈子
+ 订阅

帮用户承担一切数据库风险,给您何止是安心!

官方博客
链接