如何查询AbilityGenID≤指定值且FormID取差值最小的唯一记录
解决方案
要实现筛选AbilityGenID ≤ 指定搜索值的记录,且每个重复FormID仅保留AbilityGenID与搜索值差值最小的行(即该FormID下最大的AbilityGenID,因为差值=搜索值-AbilityGenID,值越小代表AbilityGenID越接近搜索值),可以使用窗口函数ROW_NUMBER()来完成,具体实现如下:
完整SQL语句
DECLARE @SearchValue INT = 6; -- 替换为你需要的指定搜索值 SELECT [FormID], [AbilityGenID], [Ability1ID], [Ability2ID], [HiddenID] FROM ( SELECT [FormID], [AbilityGenID], [Ability1ID], [Ability2ID], [HiddenID], -- 按FormID分组,组内按AbilityGenID降序编号,最接近搜索值的行编号为1 ROW_NUMBER() OVER (PARTITION BY [FormID] ORDER BY [AbilityGenID] DESC) AS RowNum FROM [PokéDex].[dbo].[tblPokemonAbilities] WHERE [AbilityGenID] <= @SearchValue ) AS RankedAbilities WHERE RowNum = 1 ORDER BY [FormID]; -- 可选:按FormID排序结果
语句说明
PARTITION BY [FormID]:将数据按FormID划分成独立的组ORDER BY [AbilityGenID] DESC:在每个组内,把AbilityGenID最大的行(与搜索值差值最小的行)排在首位RowNum = 1:仅保留每组的第一行,即符合需求的记录- 修改
@SearchValue的值即可切换不同的搜索条件
效果验证
针对你提供的样本数据,当@SearchValue=6时,FormID为16、17、18的记录中,AbilityGenID=4的行比3更接近6,会被优先保留,最终结果与你给出的示例完全一致。
内容的提问来源于stack exchange,提问作者ThunderSpark
相关产品推荐
相关产品推荐

