SQL Server中如何非硬编码获取年份字段前5大值的所有记录
在SQL Server中获取存在的前5大年份的所有记录
方法1:使用窗口函数DENSE_RANK()
这种方式先给所有实际存在的年份按降序排名,再筛选排名前5的年份对应的所有记录,能确保只取真实存在的年份:
WITH YearRanks AS ( SELECT DISTINCT YearColumn, -- 替换成你实际的年份字段名 DENSE_RANK() OVER (ORDER BY YearColumn DESC) AS YearRank FROM YourTableName -- 替换成你的表名 ) SELECT t.* FROM YourTableName t JOIN YearRanks yr ON t.YearColumn = yr.YearColumn WHERE yr.YearRank <= 5;
DENSE_RANK()会给每个不同的年份分配连续的排名,不会因为年份缺失出现跳号,完美匹配你要的「实际存在的最高5个年份」需求。
方法2:使用TOP 5子查询+IN
这种写法更简洁,先通过子查询提取前5个最大的不同年份,再用IN筛选主表记录:
SELECT * FROM YourTableName -- 替换成你的表名 WHERE YearColumn IN ( SELECT TOP 5 DISTINCT YearColumn -- 替换成你实际的年份字段名 FROM YourTableName ORDER BY YearColumn DESC );
性能优化建议
因为你的表有500万条记录,建议给年份字段YearColumn创建非聚集索引,这样两种方法都能避免全表扫描,大幅提升查询效率。
内容的提问来源于stack exchange,提问作者kgs_doc
相关产品推荐
相关产品推荐

