在 Hive 中,row_number() 窗口函数用于为结果集中的每一行分配一个唯一的连续编号,编号顺序由 ORDER BY 子句决定。不过,有一个细节常常让人困惑:空值(NULL)在排序中究竟如何排列?

我们先来看一下基础语法示例:
SELECT column1, column2, ..., ROW_NUMBER() OVER (ORDER BY column1 ASC, column2 DESC) AS row_numFROM table_name;
在 OVER 子句中指定排序规则:首先按 column1 升序排列,其次按 column2 降序排列。此时 Hive 会自动处理空值——默认情况下,升序时空值排在末尾,降序时空值排在最前面,具体表现取决于数据库版本。然而,这种“自动安排”往往无法满足实际业务需求。
若要精确控制空值在排序中的位置,可以添加 NULLS FIRST 或 NULLS LAST 修饰符。示例如下:
SELECT column1, column2, ..., ROW_NUMBER() OVER (ORDER BY column1 ASC NULLS FIRST, column2 DESC NULLS LAST) AS row_numFROM table_name;
这段代码的含义非常明确:column1 按升序排列时,将所有 null 值置于最前面,非空值紧随其后;column2 按降序排列时,将 null 值放在最后,非空值排在前列。这样一来,编号逻辑完全由你掌控,再也不会因为空值“插队”而感到困惑。
简单总结:row_number() 本身并不区分空值,关键在于 ORDER BY 中配合使用的 NULLS FIRST/LAST 修饰符。掌握这个技巧,在编写 Hive 窗口函数时能有效减少调试时间,提升查询准确性。
