T- SQL: Как выборочно отфильтровать дубликаты из временной таблицы - PullRequest
0 голосов
/ 06 января 2020

У меня есть набор результатов во временной таблице, которая является результатом некоторых сложных объединений, и мне нужно знать, как лучше всего фильтровать строки с одинаковым идентификатором 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, который не является значением, вычисленным в моем исходном запросе, представляет собой столбец БД, который ранжирует member / healthPlan, где имеется более одного члена. / HealthPlan комбинация для данного аккаунта.

В случае аккаунта 101273 у меня есть один и тот же участник (47570) с 3 отдельными планами медицинского обслуживания (5215, 2187, 5179). Хорошо. Я хочу ранжировать планы медицинского страхования.

Однако для accountId 160026 у меня дважды указан HealthPlanId: 5620, но с разными идентификаторами участника. Мне нужно сохранить один из этих идентификаторов участников и отбросить другой (не важно, какой я храню, поскольку меня интересует только ранжирование HealthPlanId).

По сути, в учетной записи должна быть только строка для каждый уникальный план медицинского обслуживания. Тем не менее, дубликаты memberId в порядке и должны оцениваться, пока HealthPlanId отличается.

Другими словами, выберите строки из #HealthPlans так, чтобы следующий набор результатов был:

AccountId  MemberId  HealthPlanId  RankNo
101273     47570     5215          1
101273     47570     2187          2
101273     55551     5179          3
160026     48102     5620          1

Нет необходимости показывать оригинальные объединения, потому что это в основном упрощение моей первоначальной проблемы.

Спасибо,

Шон

1 Ответ

1 голос
/ 07 января 2020

Другой метод, использующий оконную функцию:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...