首页 > 解决方案 > NTILE() 如何处理不平衡的数据?

问题描述

长话短说,我将一些数据分组到不同的段中,并注意到一列中的迁移使用NTILE(10) OVER(ORDER BY column_name DESC).

此列中大约 50% 的值是 0,这意味着前 5 个十分位数都将具有相同的值。

该函数如何NTILE()处理这样的情况?

我会天真地假设它按值排序并将其分成 10 个偶数部分,这意味着它或多或少地将 0 随机分配给十分位数,但我无法找到解释这种特殊情况的文档。

额外的问题 - 如果值是NULL而不是,行为会改变0吗?

标签: sqlhiveqlpresto

解决方案


NTILE()被定义为使图块的大小尽可能相等。大小可能相差 1 行,但不会超过 1 行。

因此,具有相同键值的行order by可以位于不同的图块中。

文档试图描述这一点:

将每个窗口分区的行划分为 n 个桶,范围从 1 到最多 n。存储桶值最多相差 1。

第二句话真的是桶大小最多相差1。


推荐阅读