MSSQL视图关联获取第二大ActivityKey报错,求低成本优化方案
解决方案:用窗口函数获取第二大ActivityKey记录
针对你的需求,推荐使用**窗口函数ROW_NUMBER()**来实现,不需要修改原视图的Group By子句,完美适配现有视图的复用场景,具体写法如下:
select -- 原视图的所有字段 ... from polmem a left join ( -- 先给polMemPremium的记录按保单+成员分组,按ActivityKey倒序排号 select policyNumber, lPolicyMemberKey, lPolicyActivityKey, -- 这里按需添加你需要从polMemPremium获取的其他字段 ROW_NUMBER() OVER ( PARTITION BY policyNumber, lPolicyMemberKey ORDER BY lPolicyActivityKey DESC ) as rn from polMemPremium ) wpmp on wpmp.policyNumber = pf.sreference and wpmp.lPolicyMemberKey = a.lPolicyMemberKey and wpmp.rn = 2 -- 取第二大的记录(rn=1是最新版本,rn=2是第二新) where -- 原视图的过滤条件 ...
方案说明
- 窗口函数的作用:
ROW_NUMBER()会按照policyNumber和lPolicyMemberKey分组,每组内按lPolicyActivityKey从大到小排序,排序后的序号rn=2就是你要的第二新修订版本记录。 - 避免修改原视图结构:这个子查询只处理
polMemPremium表的数据,原视图的其他字段和逻辑完全不需要改动,不会影响视图的其他调用方。 - 解决原SQL的错误:原SQL的问题在于ON子句中直接使用聚合函数且未明确分组范围,违反了MSSQL的语法规范;窗口函数的写法完全符合语法要求,不会出现报错。
内容的提问来源于stack exchange,提问作者Rikthra
相关产品推荐
相关产品推荐

