ROW_NUMBER() 必须配合 OVER() 使用,且 OVER() 中必须包含 ORDER BY,PARTITION BY 可选但需在 ORDER BY 前;ORDER BY 应含多字段以确保编号稳定;与 RANK()/DENSE_RANK() 行为不同,不可混用。
单独写 ROW_NUMBER() 会触发语法错误,不是函数调用失败,而是 SQL 解析器根本认不出这个写法。它不是普通函数,是窗口函数,必须绑定 OVER() 子句。
常见错误现象:ERROR: window function ROW_NUMBER requires an OVER clause
OVER() 里至少要有 ORDER BY,哪怕你只想要个任意顺序的编号,也得写上(比如 ORDER BY id)ORDER BY,语句直接无法执行,数据库不会“默认按主键排”或“按插入顺序排”PARTITION BY 是可选的,但位置必须在 ORDER BY 前面,顺序不能颠倒要不要分组,全靠 PARTITION BY 控制。它不是“加分项”,而是逻辑开关。
OVER (ORDER BY created_at DESC),不加 PARTITION BY
OVER (PARTITION BY user_id ORDER BY order_time DESC)
PARTITION BY 却以为实现了“每组 Top 1”,结果取出来的是全表第一条,不是每组第一条ORDER BY 不只是影响谁排前面,更影响编号结果是否可复现。尤其当排序字段有重复值时,单靠一个字段容易出问题。
salary DESC 排序,但多人同薪 → 数据库可能每次返回不同 rn 值ORDER BY salary DESC, emp_id ASC,让排序完全确定三者都编号,但行为差异直接影响业务结果。用错一个,Top N 或去重就漏数据。
ROW_NUMBER():强行唯一,同分也给不同号(1,2,3)RANK():同分同号,跳过后续号(1,1,3)DENSE_RANK():同分同号,不跳号(1,1,2)ROW_NUMBER() + WHERE rn = 1 取“所有最高分员工”,结果只拿到一个;该用 RANK() 才对ORDER BY 在生产环境里往往表现不稳定,尤其当数据量大、查询并发高时,同一语句反复执行可能返回不同 rn 值。