SQL Server中按优先级从Key1分组行筛选指定行的优化方案咨询
优化SQL Server按优先级筛选分组数据的方案
针对你的需求,无需多次插入临时表,可通过**窗口函数ROW_NUMBER()**结合优先级排序实现一次查询完成筛选,代码简洁高效。
实现代码
SELECT Key1, Value FROM ( SELECT Key1, Value, -- 按规则计算优先级并排序,优先级高的行排前面 ROW_NUMBER() OVER ( PARTITION BY Key1 ORDER BY CASE -- 规则1:三个条件都非空,优先级最高 WHEN Cond1 <> '' AND Cond2 <> '' AND Cond3 <> '' THEN 4 -- 规则2:Cond1空,Cond2、Cond3非空 WHEN Cond1 = '' AND Cond2 <> '' AND Cond3 <> '' THEN 3 -- 规则3:Cond1、Cond2空,Cond3非空 WHEN Cond1 = '' AND Cond2 = '' AND Cond3 <> '' THEN 2 -- 规则4:所有条件为空,优先级最低 ELSE 1 END DESC ) AS rn FROM myTable ) t WHERE rn = 1;
逻辑说明
- 分区排序:通过
PARTITION BY Key1将数据按Key1分组,每组内根据CASE语句计算的优先级值降序排序。 - 优先级赋值:给符合不同规则的行分配从4到1的优先级数值,数值越大代表优先级越高。
- 筛选结果:外层查询只取每组中排序后的第一行(
rn=1),即每个Key1对应的最高优先级数据。
该方案只需一次扫描表即可完成筛选,避免了多次插入临时表的冗余操作,性能更优,且逻辑清晰易维护。
内容的提问来源于stack exchange,提问作者KnowledgeSeeeker
相关产品推荐
相关产品推荐

