首页 > 数据库 >Hive SQL 的 ntile 分组切片函数

Hive SQL 的 ntile 分组切片函数

时间:2023-08-14 20:12:29浏览次数:44  
标签:name SQL 1988 切片 分组 Hive year ntile

Hive SQL 的 ntile 函数用于将分组数据按照顺序切分成n组,并返回当前切片值。如果切片不均匀,默认增加第一个切片的分布。它把有序的数据集合「平均分配」到指定的数量(n)个桶中, 将桶号分配给每一行。如果不能平均分配,则优先分配较小编号的桶,并且各个桶中能放的行数最多相差 1。

语法

Hive SQL 的 ntile 函数语法为:

bigint ntile(bigint <n>) over (partition by <col1>[, <col2>…]  
[order by <col1>[asc|desc][, <col2>[asc|desc]…]] [<windowing_clause>]))

参数:

  • n:必填,代表切片的数量,为 BIGINT 类型;
  • partition by [, …]:至少指定 1 个开窗口的列;
  • order by col1[asc|desc][, col2[asc|desc]…]:可选,指定返回结果的排序方式。

返回:

  • 返回 BIGINT 类型

它需要家配合窗口函数一起使用,将窗口分组数据按照顺序切片,并返回切片值。

案例

有以下数据,是一个班级名单:

'''

id|name|class|b_year|
--|----|-----|------|
 1|张涛  |    1|  1950|
 2|王琳  |    2|  2010|
 3|赵丹丹 |    1|  1996|
 4|李成  |    2|  2011|
 5|赵天成 |    3|  2000|
 6|田迪  |    1|  1988|
 7|王卫栋 |    2|  1966|
 8|周平  |    1|  1988|
 9|武明  |    3|  1977|
'''

我们按出生年 b_year 排序后,将其分为3个组(分桶分箱),ntile 会把组号(桶号)标注出来:

SELECT
    name,
    b_year,
    ntile(3) over(ORDER by b_year ASC) as nt3
FROM
    students
'''
name|b_year|nt3|
----|------|---|
张涛  |  1950|  1|
王卫栋 |  1966|  1|
武明  |  1977|  1|
田迪  |  1988|  2|
周平  |  1988|  2|
赵丹丹 |  1996|  2|
赵天成 |  2000|  3|
王琳  |  2010|  3|
李成  |  2011|  3|
'''

桶号为 1 的是前 33%,为 3 的为 66% 以后。

分组分桶

ntile 还可以将数据用窗口分组,再在分组(窗口)内标注桶号:

SELECT
    name,
    class,
    b_year,
    ntile(3) over(PARTITION by class ORDER by b_year ASC) as nt3
FROM
    students
'''
name|class|b_year|nt3|
----|-----|------|---|
张涛  |    1|  1950|  1|
田迪  |    1|  1988|  1|
周平  |    1|  1988|  2|
赵丹丹 |    1|  1996|  3|
王卫栋 |    2|  1966|  1|
王琳  |    2|  2010|  2|
李成  |    2|  2011|  3|
武明  |    3|  1977|  1|
赵天成 |    3|  2000|  2|
'''

以上先将数据按班级(class)进行窗口分组,然后在窗口内进行分桶。

标签:name,SQL,1988,切片,分组,Hive,year,ntile
From: https://www.cnblogs.com/bigdata6666/p/17629604.html

相关文章

  • sql注入基础
    什么是注入?通过把sql命令插入到web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的sql命令,从而进一步得到相应的数据信息通过构造一条精巧的语句,来查询到想要的信息注入分类按照查询字段分为:字符型当输入的参数为字符串时,称为字符型数字型......
  • 高频SQL 50题(基础版): 进店却未进行过交易的顾客 | 2023-08-14
    问题表:Visits+-------------+---------+|ColumnName|Type|+-------------+---------+|visit_id|int||customer_id|int|+-------------+---------+visit_id是该表中具有唯一值的列。该表包含有关光临过购物中心的顾客的信息。表:Transact......
  • 使用Navicate 登录SQL server时 报错 建立连接时出现与网络相关的或特定于实例的错误
    1.先查看是否允许远程连接:右键-属性-连接-允许远程连接到此服务器2.若不行的话,再检查SqlServer网络配置里面的SQLEXPRESS的协议-TCP/IP是否启用;3.启用TCP/IP协议之后,右键-属性-IP地址-找到本机ip-设置1433端口......
  • sql service行转列
    PIVOT的一般语法:SELECT[新表字段1,2,3…]FROM[原表名]AS[原表别名]PIVOT([聚合函数]([原表字段1])FOR[原表字段2]IN([原表2值1],[原表字段2值2]…))AS[新表别名]语法解释:1、PIVOT必须列举[原表字段2的值],列举的值必须用中括号[]包含起来,就算是字符串类型也不需......
  • MySQL数据库不可不学的一个数据库福利来了
    Spring常用注解redis视频集合,看完这些别说不会redis代码资料.zip代码资料解压密码:wosn.net第1章数据库简介-8-1[wosn.net].mp4第3章SQL语句规范-8-3[wosn.net].mp4第2章数据库的安装及配置-8-2.mp4第4章数据库的相关操作-8-4.mp4第10章测试字符串类型-8-10[wosn.net].mp4第11......
  • 在postgresql数据库中如何实现Oracle中dblink功能
    转:https://blog.csdn.net/weixin_73350116/article/details/131905912引言在Oracle中常常有dblink功能,可以通过dblinks实现不同地址下得oracle数据库得数据交互。dblink是Oracle独有得功能,其他数据库有吗?当然,在postgresql也可以通过fdw实现与其他数据库进行数据交互,并且相较于O......
  • mysql 加索引
    1.PRIMARY  KEY(主键索引)    mysql>ALTER  TABLE  `table_name`  ADD  PRIMARY  KEY(  `column`  ) 2.UNIQUE(唯一索引)      mysql>ALTER  TABLE  `table_name`  ADD  UNIQUE(`column`) 3.INDEX(普通索引)    mysql>ALTER ......
  • 一文玩转MQTT (ESP8266 DHT11 MQTT MYSQL方案)
    本文我们来聊一聊esp8266利用mqtt协议进行通信。并将数据数据存入数据库的操作。关于MQTTMQTT(消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的“轻量级”通讯协议,MQTT最大优点在于,用极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务。搭建MQTT服务器......
  • mysql 5.0升级到8.0
    1.替换新的驱动jar包       <dependency>           <groupId>com.mysql</groupId>           <artifactId>mysql-connector-j</artifactId>           <version>8.0.31</version>       </dependency>        ......
  • mysql怎么查询数据库容量(转)
    注:本文来源<mysql怎么查询数据库容量>  作者:文/@UTHEME2023-05-1107:00:02在数据库管理的过程中,经常需要查询数据库或表的容量大小,以方便更好地管理和优化数据库。MySQL作为一种流行的数据库管理系统,非常适合用于此任务。那么,如何在MySQL中查询数据库容量呢?首先,我们需要打......