NTILE [analytic]

将有序数据集(分区)等分成 窗口内的 {value} 个子集,其中子集通过参数 constant‑value 编号为 1。例如,如果 constant-value= 4,且分区包含 20 行,则 NTILE 会将分区行分成四个相等的子集(每个子集包含五行)。 NTILE 为行指定一个从 1 到 4 的数字,然后将每一行分配给其中一个子集。为第一个子集中的行分配 1,为第二个子集中的五行分配 2,依此类推。

如果分区行数无法被子集数整除,则任何子集的行数不得比任何其他子集多超过 1,且最小的子集具有多余行数。例如,如果 constant-value = 4,且行数 = 21,则第一个子集有 6 行,第二个子集有 5 行,依此类推。

如果子集数大于行数,则对等同于行数的子集进行填充,剩余的子集留空。

行为类型

不可变

语法

NTILE ( constant‑value ) OVER (
    [ window-partition-clause ]
    window-order-clause )

参数

constant‑value
指定子集的数目,其中 constant‑value 必须为每个分区分解成为正常数。
OVER()
请参阅分析函数

示例

下面的查询将每个月的销售额分配至四个子集之一。

=> SELECT calendar_month_name AS MONTH, SUM(sales_quantity),
      NTILE(4) OVER (ORDER BY SUM(sales_quantity)) AS NTILE
   FROM store.store_sales_fact JOIN date_dimension
   USING(date_key)
   GROUP BY calendar_month_name
   ORDER BY NTILE;
   MONTH   |   SUM   | NTILE
-----------+---------+-------
 November  | 2040726 |     1
 June      | 2088528 |     1
 February  | 2134708 |     1
 April     | 2181767 |     2
 January   | 2229220 |     2
 October   | 2316363 |     2
 September | 2323914 |     3
 March     | 2354409 |     3
 August    | 2387017 |     3
 July      | 2417239 |     4
 May       | 2492182 |     4
 December  | 2531842 |     4
(12 rows)

另请参阅