SQL Server中如何筛选最后N个CLIENT_ID对应的所有行?
解决方案
要在SQL Server中实现筛选最后N个不同CLIENT_ID对应的所有行,且支持自定义N值,可以使用**窗口函数DENSE_RANK()**来实现,具体代码如下:
DECLARE @N INT = 2; -- 替换成你需要的数值,比如20、60、100 SELECT * FROM ( SELECT *, -- 按CLIENT_ID降序排名,相同CLIENT_ID共享同一排名 DENSE_RANK() OVER (ORDER BY CLIENT_ID DESC) AS ClientRank FROM DB ) AS RankedClients -- 筛选排名在前N位的CLIENT_ID对应的所有行 WHERE ClientRank <= @N -- 可根据需求保留排序 ORDER BY CLIENT_ID;
代码说明
DECLARE @N INT = 2:定义变量@N,直接修改赋值即可调整要保留的最后N个CLIENT_ID数量,无需改动查询主体逻辑。DENSE_RANK() OVER (ORDER BY CLIENT_ID DESC):按CLIENT_ID降序生成排名,相同的CLIENT_ID会获得相同的排名,且排名是连续的(不会出现跳号),这样最后一个CLIENT_ID排名为1,倒数第二个为2,以此类推。- 外层查询通过
ClientRank <= @N筛选出排名在前N位的CLIENT_ID对应的所有行,实现需求中的筛选效果。
示例验证
以你提供的场景为例,当@N=2时:
CLIENT_ID按降序排序为C93、B99、A19,对应的排名分别为1、2、3- 筛选
ClientRank <=2后,会保留C93和B99的所有行,过滤掉A19的行,符合预期结果
内容的提问来源于stack exchange,提问作者S12000
相关产品推荐
相关产品推荐

