在Hive里,row_number()这个窗口函数的作用非常直观——它会为结果集里的每一行分配一个唯一的连续整数,就像给每个人发一个号码牌。下面这个例子应该能让你马上明白它的使用方式:

SELECT column1, column2, ..., row_number() OVER (PARTITION BY column1, column2 ORDER BY column3 DESC) as row_numFROM table_name;
简单拆解一下:这里先按column1和column2把数据分成多个小组(分区),然后在每个小组里按column3降序排列,最后给每一行一个从1开始的编号。结果集中返回的row_num列就是那个唯一的行号。
关于这个函数,有几个关键点值得说明:
首先是PARTITION BY子句。它用来划分子集,你可以指定一个或多个列作为分区的依据。每个分区内的行会重新开始编号,这就意味着不同分区里的行号可能重复——比如部门A的1号员工和部门B的1号员工,行号都是1,但没有任何冲突。
其次是ORDER BY子句。它决定了在每个分区内,行号是按什么顺序分配的。默认是升序,如果想让某列值大的排前面,就加个DESC。排序的列也可以写多个,跟普通的ORDER BY语法完全一样。
最后要强调的是,row_number()是一个窗口函数,所以它只能在支持窗口函数的SQL引擎里用,比如Hive、Spark SQL、PostgreSQL等。如果你用的数据库不支持窗口函数,那这个写法可就行不通了。
