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

问题描述 投票:1回答:1

想使用 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
sql window-functions quantile
1个回答
1
投票

你可以使用 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;

我不会用 "四分位数 "这个词来形容这一列。 四分位数意味着四个大小相等的箱(或者至少在给定重复值的情况下尽可能的接近)。


1
投票

宽度_篮子 函数符合这种情况。

WIDTH_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<>fiddle demo

产出:

+----------+--------------+----+-------+
| 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 |
+----------+--------------+----+-------+
© www.soinside.com 2019 - 2024. All rights reserved.