SQL Server 在ON子句中使用次高值

disho6za  于 2023-01-29  发布在  其他
关注(0)|答案(1)|浏览(205)

我有一个现有的MSSQL视图,我需要在其中包含一个新的视图联接。要获取正确的记录数据,我需要选择ActivityKey第二高的条目(实际上是策略的第二个最新修订版)。

select 
...
from polmem a
left join polMemPremium wpmp on (wpmp.policyNumber=pf.sreference
and wpmp.lPolicyMemberKey=a.lPolicyMemberKey 
and wpmp.lPolicyActivityKey = (select Max(wpmp.lPolicyActivityKey) where wpmp.lPolicyActivityKey 
NOT IN (SELECT MAX(wpmp.lPolicyActivityKey))))
where 
...

但上述结果会导致此错误:
聚合不能出现在ON子句中,除非它位于HAVING子句或选择列表中包含的子查询中,并且要聚合的列是外部引用。
实际上,错误是告诉我需要使用聚合

(select Max(wpmp.lPolicyActivityKey) where wpmp.lPolicyActivityKey NOT IN (SELECT MAX(wpmp.lPolicyActivityKey)))

然后在Group By中列出视图的Select语句中的大多数列(如果不是全部的话)。我的问题是,因为这是一个在多个位置使用的视图,而MSSQL想要做的是为了我认为相对简单的添加而对视图进行大规模更改。我只是想知道我是否处理错了,是否有更好的方法来实现我想要的?

pbossiut

pbossiut1#

你可以试试这样:

select ...
from .....
..........
cross apply (select 
               *
               ,row_number() over (order by wpmp.lPolicyActivityKey desc)
             from web_PolicyMemberPremium wpmp
             where wpmp.policyNumber=pf.sreference 
             and wpmp.lPolicyMemberKey=a.lPolicyMemberKey) wpmp
....
where ...
and wpmp.rn = 2

我添加了cross apply(这意味着表中应该有一个策略,否则行将被排除),您可以放置一个外部apply并将where子句改为isnull(wpmp.rn,2)= 2或类似的......但这对我来说没有多大意义。
附言。如果你用一种好的方式格式化代码,这将对我们(主要是你)有很大帮助。

相关问题