📣
TiDB Cloud Premium 开放公测中。为企业级工作负载提供无限扩展、即时弹性伸缩和高级安全保障。此页面由 AI 自动翻译,英文原文请见此处。

NTILE



将行划分到指定数量的存储桶中,并为每一行分配一个存储桶编号。行会尽可能均匀地分布到各个存储桶中。

语法

NTILE(bucket_count) OVER ( [ PARTITION BY partition_expression ] ORDER BY sort_expression [ ASC | DESC ] )

参数:

  • bucket_count:必需。要创建的存储桶数量(必须为正整数)
  • PARTITION BY:可选。将行划分为分区
  • ORDER BY:必需。确定分布顺序
  • ASC | DESC:可选。排序方向(默认值:ASC)

说明:

  • 存储桶编号范围为 1 到 bucket_count
  • 行会尽可能均匀地分布
  • 如果行数不能均匀划分,靠前的存储桶会多分配一行
  • 适用于创建百分位和等大小分组

示例

-- Create sample data CREATE TABLE scores ( student VARCHAR(20), subject VARCHAR(20), score INT ); INSERT INTO scores VALUES ('Alice', 'Math', 95), ('Alice', 'English', 87), ('Alice', 'Science', 92), ('Bob', 'Math', 85), ('Bob', 'English', 85), ('Bob', 'Science', 80), ('Charlie', 'Math', 88), ('Charlie', 'English', 85), ('Charlie', 'Science', 85);

将所有分数划分为 3 个存储桶(三等分):

SELECT student, subject, score, NTILE(3) OVER (ORDER BY score DESC) AS score_bucket FROM scores ORDER BY score DESC, student, subject;

结果:

student | subject | score | score_bucket --------+---------+-------+------------- Alice | Math | 95 | 1 Alice | Science | 92 | 1 Charlie | Math | 88 | 1 Alice | English | 87 | 2 Bob | English | 85 | 2 Bob | Math | 85 | 2 Charlie | English | 85 | 3 Charlie | Science | 85 | 3 Bob | Science | 80 | 3

在每个学生内部将分数划分为四分位:

SELECT student, subject, score, NTILE(2) OVER (PARTITION BY student ORDER BY score DESC) AS performance_half FROM scores ORDER BY student, score DESC, subject;

结果:

student | subject | score | performance_half --------+---------+-------+----------------- Alice | Math | 95 | 1 Alice | Science | 92 | 1 Alice | English | 87 | 2 Bob | English | 85 | 1 Bob | Math | 85 | 1 Bob | Science | 80 | 2 Charlie | Math | 88 | 1 Charlie | English | 85 | 2 Charlie | Science | 85 | 2

文档内容是否有帮助?