Tsql T-SQL:如何有选择地从临时表中筛选出重复项

Tsql T-SQL:如何有选择地从临时表中筛选出重复项,tsql,Tsql,我在一个临时表中有一个结果集,它是一些复杂联接的结果,需要知道过滤具有相同重复AccountId/HealthPlanId的行的最佳方法,如下所示 select * from #HealthPlans 内容如下: AccountId MemberId HealthPlanId RankNo 101273 47570 5215 1 101273 47570 2187 2 101273 55551 5179

我在一个临时表中有一个结果集,它是一些复杂联接的结果,需要知道过滤具有相同重复AccountId/HealthPlanId的行的最佳方法,如下所示

select * from #HealthPlans
内容如下:

AccountId  MemberId  HealthPlanId  RankNo
101273     47570     5215          1
101273     47570     2187          2
101273     55551     5179          3
160026     48102     5620          1
160026     48446     5620          2
在这个场景中,RankNo不是我原始查询计算的值,而是一个db列,它对给定帐户上有多个成员/健康计划组合的成员/健康计划进行排序

在账户101273中,我有相同的成员47570,有3个单独的健康计划5215、2187、5179。那很好。我想对健康计划进行排名

但是,对于accountId 160026,我已经列出了healthPlanId:5620两次,但有不同的memberId。我需要保留其中一个成员id,丢弃另一个。保留哪一个并不重要,因为我只对HealthPlanId的排名感兴趣

基本上,一个帐户应该只为每个独特的健康计划设置一行。但是,复制memberId是可以的,只要HealthPlanId不同,就应该对其进行排名

换言之,从HealthPlans中选择行,以便以下为结果集:

AccountId  MemberId  HealthPlanId  RankNo
101273     47570     5215          1
101273     47570     2187          2
101273     55551     5179          3
160026     48102     5620          1
没有必要显示原始联接,因为这基本上是对原始问题的简化

谢谢


Sean

使用窗口函数的另一种方法:

DECLARE @tab TABLE (AccountId int,  MemberId int,  HealthPlanId int,  RankNo int)
INSERT @tab VALUES
(101273,47570,5215,1),
(101273,47570,2187,2),
(101273,55551,5179,3),
(160026,48102,5620,1),
(160026,48446,5620,2)




SELECT *
FROM(
    SELECT ROW_NUMBER() OVER(PARTITION BY t.AccountId, t.HealthPlanId ORDER BY t.RankNo) rn, t.*
    FROM @tab t
    ) t2
WHERE t2.rn = 1
您的特定查询可能如下所示:

SELECT *
FROM(
    SELECT ROW_NUMBER() OVER(PARTITION BY hp.AccountId, hp.HealthPlanId ORDER BY hp.RankNo) rn, hp.*
    FROM #HealthPlans hp
    ) hp2
WHERE hp2.rn = 1