Удаление дублирующихся значений с сервера SQL при условии 2 столбцов - PullRequest
0 голосов
/ 26 сентября 2018
|Rownumber  |OldIdassigned  |commoncode  |
------------------------------------------
| 1         |FLEX           |Y2573F102   |
------------------------------------------
| 2         |RCL            |Y2573F102   |
------------------------------------------
| 3         |FLEX           |Y2573F102   |
------------------------------------------
| 4         |QGEN           |N72482123   |
------------------------------------------
| 5         |QGEN           |N72482123   |
------------------------------------------
| 6         |QGEN           |N72482123   |
------------------------------------------
| 7         |RACE           |N72482123   |
------------------------------------------
| 8         |CLB            |N22717107   |
------------------------------------------
| 9         |CLB            |N22717107   |
------------------------------------------
<b>| 10     |CLB            |N22717107   |


Мне нужно удалить дубликаты записей на основе общего кода и условия, что - если oldidassigned такой же, то удалить, иначе удалить не удастся.

Дляпример Y2573F102 имеет 3 повторяющихся строки записей 1,2,3 .... 1,2 удалять не нужно, нужно удалить только 3-ю строку.

Ответы [ 5 ]

0 голосов
/ 26 сентября 2018

Поскольку все ответы одинаковы (и правильны), я опубликую один альтернативный способ:

DELETE FROM TableA
WHERE EXISTS ( SELECT * FROM TableA AS A2
               WHERE A2.commoncode = TableA.commoncode
                 AND A2.OldIdassigned = TableA.OldIdassigned
                 AND A2.Rownumber < TableA.Rownumber )
0 голосов
/ 26 сентября 2018

Использовать Row_Number ()

delete t from 
(select *, row_number() over(partition by commoncode order by 
 rownumber) as rn) t 
 where rn<>1
0 голосов
/ 26 сентября 2018

используйте оконную функцию row_number, в соответствии с вашим описанием и комментариями, вам кажется, что вам нужно изменить раздел раздела

delete t
from
(select t1.*,row_number() over(partition by commoncode order by  Rownumber) rn from table t1
)t where rn<>1

https://dbfiddle.uk/?rdbms=sqlserver_2017&fiddle=eacc0688efb534a0addee68678f323fe

0 голосов
/ 26 сентября 2018

Использовать ROW_NUMBER():

DELETE t
FROM (SELECT t.*, ROW_NUMBER() OVER (PARTITION BY OldIdassigned, commoncode ORDER BY rownumber) AS Seq
      FROM table t
     ) t
WHERE t.seq > 1;

РЕДАКТИРОВАТЬ: Если вы хотите проверить дублирование только на основе commoncode, тогда удалите OldIdassigned из PARTITION предложение:

DELETE t
FROM (SELECT t.*, ROW_NUMBER() OVER (PARTITION BY commoncode ORDER BY rownumber DESC) AS Seq
      FROM table t
     ) t
WHERE t.seq > 1; 
0 голосов
/ 26 сентября 2018

Мне нравятся обновляемые CTE и оконные функции для этой цели:

with todelete as (
      select t.*,
             row_number() over (partition by commoncode order by rownumber) as seqnum
      from t
     )
delete todelete
    where seqnum > 1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...