在SQL Server中按字段取第一条记录,常用方法有三种:一是使用TOP 1配合ORDER BY,如SELECT TOP 1 * FROM table ORDER BY field,适合单表按字段排序取首条;二是通过ROW_NUMBER()窗口函数,如SELECT * FROM (SELECT *, ROW_NUMBER() OVER (PARTITION BY group_field ORDER BY sort_field) AS rn FROM table) t WHERE rn = 1,支持分组取每组第一条;三是子查询结合MIN/MAX,如SELECT * FROM table WHERE field = (SELECT MIN(field) FROM table),适用于取最小/最大值对应记录,实际应用中,按需选择排序规则和分组逻辑即可高效获取目标数据。
在数据库查询中,经常需要根据某个字段的值(如时间、金额、序号等)获取排序后的第一条记录,获取每个部门薪资最高的员工、查询最新发布的商品、找出成绩最高的学生等,SQL Server提供了多种实现方式,本文将介绍最常用的几种方法,并分析其适用场景和注意事项。
使用 TOP 1 与 ORDER BY 基础方法
这是最简单直观的方式,通过 TOP 1 限制返回记录数量,结合 ORDER BY 对目标字段排序,直接获取第一条记录。
语法示例
-- 升序取最小值(如最早的日期、最小的金额) SELECT TOP 1 * FROM 表名 ORDER BY 目标字段 ASC; -- 降序取最大值(如最新的日期、最高的金额) SELECT TOP 1 * FROM 表名 ORDER BY 目标字段 DESC;
实际案例
假设有一个 Student 表(包含 StudentID、Name、Score 字段),需要查询成绩最高的学生:

SELECT TOP 1 * FROM Student ORDER BY Score DESC;
若需要查询成绩最低的学生,则将 DESC 改为 ASC:
SELECT TOP 1 * FROM Student ORDER BY Score ASC;
注意事项
- 必须配合
ORDER BY:若不加ORDER BY,TOP 1返回的可能是任意一条记录(取决于数据存储顺序),不符合“按字段取第一条”的需求。 - 重复值处理:如果目标字段存在多个相同值(如多人并列最高分),
TOP 1只会随机返回其中一条,若需返回所有符合条件的记录,需结合其他方法(如后文提到的FETCH WITH TIES)。
使用窗口函数 ROW_NUMBER() 处理分组取第一条
当需求是“按某个字段分组后,取每组的第一条记录”时(如每个部门的薪资最高员工),TOP 1 无法直接实现,需借助窗口函数 ROW_NUMBER()。
语法说明
ROW_NUMBER() 可为结果集中的每一行分配一个唯一的序号(从1开始),结合 PARTITION BY 分组后,再通过 ORDER BY 排序,最后筛选出序号为1的记录。
实际案例
假设有一个 Employee 表(包含 EmployeeID、Department、Salary 字段),需要查询每个部门薪资最高的员工:
WITH RankedEmployees AS (
SELECT
EmployeeID,
Department,
Salary,
ROW_NUMBER() OVER (PARTITION BY Department ORDER BY Salary DESC) AS Rank
FROM Employee
)
SELECT EmployeeID, Department, Salary
FROM RankedEmployees
WHERE Rank = 1;
PARTITION BY Department:按“部门”分组;ORDER BY Salary DESC:组内按薪资降序排序;WHERE Rank = 1:筛选出每组的第1条记录(薪资最高)。
其他窗口函数的对比
RANK():若存在并列(如多人同组同薪资),会分配相同序号,且后续序号跳过(如1、1、3);DENSE_RANK():并列时不跳过序号(如1、1、2);ROW_NUMBER():强制分配唯一序号(即使并列也会按底层顺序分配1、2、3)。
若需保留所有并列的“第一条”记录,可将 ROW_NUMBER() 改为 RANK() 或 DENSE_RANK(),并调整筛选条件(如 WHERE Rank <= 1)。
使用 FETCH FIRST N ROWS ONLY(SQL Server 2012+)
SQL Server 2012 引入了 FETCH FIRST 语法,更符合 SQL 标准,功能上与 TOP 类似,但支持 WITH TIES 选项,可方便处理重复值。
语法示例
-- 基础用法(等同于 TOP 1) SELECT * FROM 表名 ORDER BY 目标字段 DESC FETCH FIRST 1 ROWS ONLY; -- 包含重复值(返回所有符合条件的“第一条”) SELECT * FROM 表名 ORDER BY 目标字段 DESC FETCH FIRST 1 ROWS WITH TIES;
实际案例
仍以 Student 表为例,若多人并列最高分(如100分),需返回所有100分的学生:
-- 仅返回1条(可能随机选一个100分学生) SELECT TOP 1 * FROM Student ORDER BY Score DESC; -- 返回所有100分学生 SELECT * FROM Student ORDER BY Score DESC FETCH FIRST 1 ROWS WITH TIES;
注意事项
FETCH FIRST是 SQL 标准语法,可读性更强,但需 SQL Server 2012 及以上版本支持;WITH TIES会返回所有与“第一条”记录目标字段值相同的记录,可能导致返回多条数据,需结合业务需求判断是否使用。
性能优化建议
无论采用哪种方法,排序操作(ORDER BY)都可能影响性能,尤其在大表场景下,以下是优化方向:
为排序字段创建索引
如果频繁按某字段排序取第一条,可为该字段创建索引(降序索引需 SQL Server 2008+ 以上版本支持):
-- 升序索引 CREATE INDEX IX_Student_Score ON Student(Score ASC); -- 降序索引 CREATE INDEX IX_Student_Score_Desc ON Student(Score DESC);
索引能显著加快排序速度

