想使用 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
你可以使用 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;
我不会用 "四分位数 "这个词来形容这一列。 四分位数意味着四个大小相等的箱(或者至少在给定重复值的情况下尽可能的接近)。
宽度_篮子 函数符合这种情况。
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
产出:
+----------+--------------+----+-------+
| 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 |
+----------+--------------+----+-------+