Как удалить дубликаты с сервера SQL на основе строки - PullRequest
3 голосов
/ 01 апреля 2019

удаление дубликатов из таблицы SQL

пример: i / p:

EID EName ....  ERole    
1    Nani       SQL    
2    Nani       SQL Developer     
3    Suresh     ASP .Net Developer     
4    Suresh     ASP .Net    
5    Ravi       Sales Force    
6    Ravi       Sales Force developer 

У меня есть набор данных, как указано выше,

Вывод:

EID EName ....  ERole     
2    Nani       SQL Developer     
3    Suresh     ASP .Net Developer     
6    Ravi       Sales Force developer 

Примечание, приведенное выше, является примером:

в столбце ERole, если первые 10 символов совпадают, это должен быть дубликат.

Ответы [ 6 ]

2 голосов
/ 01 апреля 2019

Сначала я собираюсь настроить ваш пример, чтобы вы могли проверить его.

CREATE TABLE #example
(
    EID INT PRIMARY KEY IDENTITY,
    EName VARCHAR(100),
    ERole VARCHAR(MAX)
)

INSERT INTO 
    #example
VALUES
    ('Nani','SQL'),
    ('Nani','SQL Developer'),
    ('Suresh','ASP .Net Developer'),
    ('Suresh','ASP .Net'),
    ('Ravi','Sales Force'),
    ('Ravi','Sales Force developer')

Теперь, если вы хотите удалить дублированную запись по вашим критериям (то же самое имя, те же первые 10 символов в ERole), вы можете использовать это:

WITH grouped_example as (
SELECT
        ROW_NUMBER() OVER(PARTITION BY Ename, SUBSTRING(ERole,0,10) ORDER BY ERole DESC) as preserve,
        EID
    FROM #example
)
DELETE FROM grouped_example where preserve <> 1

Если вы хотите ВЫБЕРИТЬ без дубликатов, вы можете использовать это:

WITH grouped_example as (
SELECT
        ROW_NUMBER() OVER(PARTITION BY Ename, SUBSTRING(ERole,0,10) ORDER BY ERole DESC) as preserve,
        *
    FROM #example
)
SELECT EID,EName,ERole FROM grouped_example where preserve = 1

* Примечание: я использую ORDER BY ERole DESC, чтобы мы оставались с ролью с большим количеством информации (больше символов) * Примечание 2: вы можете изменить количество символов, которое вам нужно сопоставить, изменив последнее значение SUBSTRING ()

1 голос
/ 01 апреля 2019

в столбце ERole, если первые 10 символов совпадают, это должен быть дубликат

WITH CTE AS
(
  SELECT *, 
         ROW_NUMBER() OVER(PARTITION BY LEFT(EROle, 10) ORDER BY EID) RN
  FROM T
)
DELETE T 
FROM CTE INNER JOIN T
ON CTE.EID = T.EID
WHERE RN > 1;
0 голосов
/ 01 апреля 2019

Попробуйте это

 with cte as
(
select *,row_number()over(partition by LEFT(EROle, 10) order by left(EROle, 10) rn
from  T
) delete from cte where rn=1
0 голосов
/ 01 апреля 2019

После просмотра набора данных это должно работать для вас!

CREATE TABLE test 
(
EID int,
ENAME VARCHAR(20),
EROLE  VARCHAR(30));

INSERT INTO test
VALUES (1,'NANI','SQL'),
        (2,'NANI','SQL DEVELOPER'),
        (3,'Suresh','ASP .NET Developer'),
        (4,'Suresh', 'ASP .Net'),
        (5, 'Ravi', 'Sales Force'),
        (6, 'Ravi', 'Sales Force developer');

DELETE FROM test
WHERE EID IN(
SELECT EID FROM (
SELECT *, ROW_NUMBER() OVER (PARTITION BY ENAME ORDER BY LEN(EROLE) DESC) as RN
from #test) tab1 WHERE RN != 1);

SELECT * FROM test
0 голосов
/ 01 апреля 2019

Для ваших данных вы можете использовать:

select t.*
from t
where not exists (select 1
                  from t t2
                  where t2.ename = t.ename and
                        t.erole like t2.erole + '%' and
                        t.eid < t2.eid
                 );

Сюда не входит ограничение «первые десять символов». Но я подозреваю, что это действительно то, что вы хотите.

0 голосов
/ 01 апреля 2019

в соответствии с набором данных, если имя строго соответствует одной роли, то ниже будет работать

with cte as
(
select *,row_number()over(partition by ename order by ename) rn
from table_name
) delete from cte where rn>1
...