Как перенести этот оператор SELECT в DELETE? - PullRequest
0 голосов
/ 26 июня 2018
SELECT * 
FROM (SELECT *, 
             ROW_NUMBER() 
             OVER (
                  PARTITION BY ResidentID, PostedON, PayerTypeID    
                  ORDER BY StatementNumber
                  ) seq
    FROM Statements
    ) s
        INNER JOIN person p ON s.ResidentID = p.ID
WHERE seq > 1
AND p.FacilityID = 275
ORDER BY s.ResidentID

Имея соленое время, переводя это в УДАЛЕНИЕ.Кто-нибудь получил представление о том, почему?

Вот исходная проблема:

Хорошо, поэтому недостаток в моем коде создал кучу дублирующих операторов для одного заряда.У них тот же ResidentID и та же дата Опубликовано, но разные идентификаторы и StatementID

ID  |  ResidentID  |  StatementID  |  PostedON
1         4039            10          06-15-18
2         4039            11          06-15-18
3         4039            12          06-15-18

4         4039            20          06-20-18
5         4039            21          06-20-18
6         4039            22          06-20-18

7         3456            13          06-15-18
8         3456            14          06-15-18
9         3456            15          06-15-18

10        3456            23          06-21-18
11        3456            24          06-21-18

У меня есть длинный список многих ResidentID, которые имеют дубликаты во многих датах.Как удалить все строки, кроме строки с наименьшим StatementID для уникальной даты для этого residentID

Я хочу удалить все дубликаты, кроме наименьшего StatementID, связанного с этой датой / residentID

РЕДАКТИРОВАТЬ:

На самом деле я могу использовать команду обновления, так как в этой таблице есть столбец мягкого удаления, но все же я не могу заставить его работать.Я жалок, я знаю.

Ответы [ 2 ]

0 голосов
/ 26 июня 2018

Напишите запрос как:

SELECT s.* 
FROM (SELECT s.*, 
             ROW_NUMBER() OVER (PARTITION BY ResidentID, PostedON, PayerTypeID    
                                ORDER BY StatementNumber
                               ) as seqnum
      FROM Statements s
      WHERE EXISTS (SELECT 1
                    FROM person p 
                    WHERE s.ResidentID = p.ID AND p.FacilityID = 275
     ) s
WHERE seq > 1;

Вуаля!Это обновляемый CTE.Вы можете просто удалить из него.Я бы сказал это так:

with todelete as (
          SELECT s.*, 
                 ROW_NUMBER() OVER (PARTITION BY ResidentID, PostedON, PayerTypeID    
                                    ORDER BY StatementNumber
                                   ) as seqnum
          FROM Statements s
          WHERE EXISTS (SELECT 1
                        FROM person p 
                        WHERE s.ResidentID = p.ID AND p.FacilityID = 275
         )
delete todelete
    where seqnum > 1;

Вы можете легко изменить это на update:

with toupdate as (
          SELECT s.*, 
                 ROW_NUMBER() OVER (PARTITION BY ResidentID, PostedON, PayerTypeID    
                                    ORDER BY StatementNumber
                                   ) as seqnum
          FROM Statements s
          WHERE EXISTS (SELECT 1
                        FROM person p 
                        WHERE s.ResidentID = p.ID AND p.FacilityID = 275
         )
update toupdate
    set softdelete = 1
    where seqnum > 1;         
0 голосов
/ 26 июня 2018

Предполагается, что вам нужно удалить из statemensts не лиц и что StatementNumber равен PRIMARY KEY

DELETE
FROM
Statements SX
WHERE
SX.StatementNumber IN 
(SELECT s.StatementNumber  
FROM (SELECT *, 
             ROW_NUMBER() 
             OVER (
                  PARTITION BY ResidentID, PostedON, PayerTypeID    
                  ORDER BY StatementNumber
                  ) seq
    FROM Statements
    ) s
        INNER JOIN person p ON s.ResidentID = p.ID
WHERE seq > 1
AND p.FacilityID = 275
ORDER BY s.ResidentID)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...