如何用Microsoft SQL筛选各编号下最高customer_confidence的记录?
解决Microsoft SQL中按编号取最高客户置信度记录的问题
问题分析
你需要实现的是按编号(no)分组,返回每组中customer_confidence最高的完整记录,对应两种场景:
- 场景1:同一编号+同一客户有多条置信度记录,取最高值的那条
- 场景2:同一编号下有多个客户,取置信度最高的那个客户的记录
你之前尝试的语句存在逻辑问题:distinct搭配max()的写法不成立,要么会因聚合函数缺少group by报错,即便加了group by no, customer,也会返回所有no+customer的组合,无法实现“仅取每组最高置信度”的需求。
解决方案:使用窗口函数ROW_NUMBER()
在Microsoft SQL Server中,最简洁高效的方式是用ROW_NUMBER()窗口函数,按编号分组后排序筛选:
WITH ranked_records AS ( SELECT no, customer, customer_confidence, -- 按no分组,组内按置信度降序排序,最高值的行号标记为1 ROW_NUMBER() OVER (PARTITION BY no ORDER BY customer_confidence DESC) AS rn FROM your_table_name -- 替换为你的实际表名 ) SELECT no, customer, customer_confidence FROM ranked_records WHERE rn = 1;
代码说明
PARTITION BY no:将数据按编号拆分为独立分组ORDER BY customer_confidence DESC:每个分组内按置信度从高到低排序ROW_NUMBER():为分组内的每行分配序号,最高置信度的行序号为1- 最后筛选
rn=1的记录,就是每个编号下置信度最高的那条
特殊情况处理(可选)
如果存在同一编号下多个客户置信度相同且均为最高值,可按需调整:
- 若要返回所有最高置信度的记录,将
ROW_NUMBER()替换为RANK()或DENSE_RANK() - 若要指定优先级(比如按客户编号排序),可在
ORDER BY后追加customer ASC或DESC
内容的提问来源于stack exchange,提问作者N K
相关产品推荐
相关产品推荐

