如何使用列值的范围应用ntile(4)?

ocebsuys  于 2021-08-09  发布在  Java
关注(0)|答案(2)|浏览(378)

希望使用 NTILE 看各国林地分布占总土地面积的百分比。我想使用的列中的值的范围是从0.00053到非常接近98.25,并且国家不是均匀分布在该范围所暗示的四分位数上,即0到25,25到50,50到75,以及75到100。相反, NTILE 只是将表划分为四个具有相同行数的组。如何使用 NTILE 根据值分配分位数?

SELECT country, forest, pcnt_forest,
       NTILE(4) OVER(ORDER BY pcnt_forest) AS quartile
FROM percent_forest
ubbxdtey

ubbxdtey1#

你可以使用 case 表达式:

select pf.*,
       (case when pcnt_forest < 0.25 then 1
             when pcnt_forest < 0.50 then 2
             when pcnt_forest < 0.75 then 3
             else 4
        end) as bin
from percent_forest pf;

或者,更简单的是,使用算术:

select pf.*,
       floor(pcnt_forest * 4) + 1 bin
from percent_forest pf;

我不会用“四分位数”这个词来形容这个专栏。四分位数表示四个大小相等的箱子(或者至少在给定重复值时尽可能接近)。

mtb9vblg

mtb9vblg2#

width\u bucket函数最适合这种情况:
width\u bucket(oracle)允许您构造等宽直方图,其中直方图范围被划分为大小相同的区间(将此函数与创建等高直方图的ntile进行比较。)
它是由oracle,snowflake,postgresql,。。。
您的代码:

SELECT country,  pcnt_forest
       ,WIDTH_BUCKET(pcnt_forest, 0, 1, 4) AS w
       ,NTILE(4) OVER(ORDER BY pcnt_forest) AS ntile  -- for comparison
FROM percent_forest
ORDER BY w

db<>小提琴演示
输出:

+----------+--------------+----+-------+
| COUNTRY  | PCNT_FOREST  | W  | NTILE |
+----------+--------------+----+-------+
| A        |         .05  | 1  |     1 |
| B        |         .06  | 1  |     1 |
| C        |         .07  | 1  |     2 |
| E        |         .49  | 2  |     2 |
| D        |         .51  | 3  |     3 |
| F        |         .96  | 4  |     3 |
| G        |         .97  | 4  |     4 |
| H        |         .98  | 4  |     4 |
+----------+--------------+----+-------+

相关问题