Запрос на предоставление запроса на удаление повторяющихся записей - PullRequest
0 голосов
/ 14 июля 2020

Case-1

Если все записи находятся в состоянии исключения для этого конкретного Ref_No

Удалить все записи, кроме первой записи

Case-2

Если некоторые записи находятся в состоянии исключения, а одна - в состоянии сопоставления для этого конкретного Ref_No

Удалить все записи, статус которых находится в исключении

Запрос ниже работает нормально для случая-2, но не работает для варианта-1. Попросите кого-нибудь помочь с вопросом.

with cte
       as (
       select ROW_NUMBER() over (partition by Ref_No order by Id) RN ,* from 
      Table1
       )
                     
 Delete from cte where Final_status <> 'MATCHED'

введите описание изображения здесь

Ответы [ 3 ]

1 голос
/ 14 июля 2020

Это избавляет от необходимости предполагать, что есть только два конечных статуса:

delete from T
where exists (
    select 1 from T t2
    where t2.Ref_No = T.Ref_No and t2.Id <> T.Id and (
            -- if it's not matched and there's another row that is
            T.Final_status <> 'Matched' and t2.Final_status = 'Matched'
            -- it's not the first row that's non-matched 
        or  T.Id > t2.Id and not 'Matched' in (T.Final_status, t2.Final_status)
    );

Вы все равно можете использовать выражение case для свертывания сопоставленного и несовпадающего в два сортируемых состояния. Этот запрос более переносимый и не полагается на идею удаления из табличного выражения.

1 голос
/ 14 июля 2020

Мы можем go для ORDER BY DES C, чтобы статус MATCHED шел вверху, если он присутствует. Если нет статуса MATCHED, то статус EXCEPTION будет вверху.

Таким образом, мы сохраняем только ранг 1, а затем удаляем дубликаты.

;WITH CTE AS
(
SELECT ID,Ref_No, ROW_NUMBER() OVER(PARTITION BY Ref_No ORDER BY Final_Status DESC) AS rnk , Final_Status
FROM Table
)
DELETE FROM CTE
WHERE rnk > 1
1 голос
/ 14 июля 2020

Если "исключение" и "сопоставлено" - единственные варианты окончательного статуса, тогда вы можете ORDER BY Final_Status DESC в своем row_number. А затем добавьте условие WHERE, чтобы никогда не удалять RN = 1

with cte
       as (
       select ROW_NUMBER() over (partition by Ref_No order by Final_Status DESC, Id) RN ,* from 
      Table1
       )
                     
Delete from cte 
where Final_status <> 'MATCHED'
AND RN>1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...