Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Удаление дубликатов  [new]
Tenya
Member

Откуда:
Сообщений: 4
Добрый день.

Есть таблица вида

id | name | surname
--------------------
1 | niko | L
2 | inna | B
1 | niko | L
3 | jane | A
3 | jane | A
4 | katy | S
5 | ivan | J
6 | inna | X

В результате необходимо вывести данные только по столбцам name и surname, при этом, удалив дубликаты по id.
Т.е. результат такой:

name | surname
--------------------
niko | L
inna | B
jane | A
katy | S
ivan | J

Возможно ли сделать это с помощью distinct?
Если нет, какие еще есть варианты?
13 фев 20, 16:07    [22079375]     Ответить | Цитировать Сообщить модератору
 Re: Удаление дубликатов  [new]
1C Developer
Member

Откуда:
Сообщений: 64
Добрый:

ROW_NUMBER()
13 фев 20, 16:16    [22079385]     Ответить | Цитировать Сообщить модератору
 Re: Удаление дубликатов  [new]
entrypoint
Member

Откуда:
Сообщений: 227
Tenya
Добрый день.

Есть таблица вида

id | name | surname
--------------------
1 | niko | L
2 | inna | B
1 | niko | L
3 | jane | A
3 | jane | A
4 | katy | S
5 | ivan | J
6 | inna | X

В результате необходимо вывести данные только по столбцам name и surname, при этом, удалив дубликаты по id.
Т.е. результат такой:

name | surname
--------------------
niko | L
inna | B
jane | A
katy | S
ivan | J

Возможно ли сделать это с помощью distinct?
Если нет, какие еще есть варианты?



Если удаляем дубликаты по id, то куда подевалась уникальная 6 | inna | X в итоговом рекордсете ?
Вы точно описываете проблему ?
13 фев 20, 16:18    [22079388]     Ответить | Цитировать Сообщить модератору
 Re: Удаление дубликатов  [new]
Tenya
Member

Откуда:
Сообщений: 4
entrypoint, проблема описана верно, а вот при написании результата промашка вышла. Спасибо за замечание.

Итог такой должен быть:

name | surname
--------------------
niko | L
inna | B
jane | A
katy | S
ivan | J
inna | X
13 фев 20, 16:29    [22079392]     Ответить | Цитировать Сообщить модератору
 Re: Удаление дубликатов  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7332
Tenya,

селект дубли в таблицу хэвинг счетчик > 1
удалить top (1) где индекс в таблице дублей
13 фев 20, 16:38    [22079403]     Ответить | Цитировать Сообщить модератору
 Re: Удаление дубликатов  [new]
entrypoint
Member

Откуда:
Сообщений: 227
Tenya,

или
WITH a (id, [name], surname) AS 
(
    SELECT 1, 'niko', 'L' UNION ALL
    SELECT 2, 'inna', 'B' UNION ALL
    SELECT 1, 'niko', 'L' UNION ALL
    SELECT 3, 'jane', 'A' UNION ALL
    SELECT 3, 'jane', 'A' UNION ALL
    SELECT 4, 'katy', 'S' UNION ALL
    SELECT 5, 'ivan', 'J' UNION ALL
    SELECT 6, 'inna', 'X'
) 
SELECT MIN([name]) AS name, MIN(surname) AS surname
FROM a
GROUP BY a.id

или
WITH a (id, [name], surname) AS 
(
    SELECT 1, 'niko', 'L' UNION ALL
    SELECT 2, 'inna', 'B' UNION ALL
    SELECT 1, 'niko', 'L' UNION ALL
    SELECT 3, 'jane', 'A' UNION ALL
    SELECT 3, 'jane', 'A' UNION ALL
    SELECT 4, 'katy', 'S' UNION ALL
    SELECT 5, 'ivan', 'J' UNION ALL
    SELECT 6, 'inna', 'X'
), 
b AS ( 
SELECT 
       [name]
     , surname
	, ROW_NUMBER() OVER (PARTITION BY id ORDER BY (SELECT 1)) AS rn 
FROM 
     a) 
SELECT [name], surname
FROM b
WHERE b.rn = 1;
13 фев 20, 16:39    [22079406]     Ответить | Цитировать Сообщить модератору
 Re: Удаление дубликатов  [new]
msLex
Member

Откуда:
Сообщений: 7620
entrypoint
WITH a (id, [name], surname) AS 
(
    SELECT 1, 'niko', 'L' UNION ALL
    SELECT 2, 'inna', 'B' UNION ALL
    SELECT 1, 'niko', 'L' UNION ALL
    SELECT 3, 'jane', 'A' UNION ALL
    SELECT 3, 'jane', 'A' UNION ALL
    SELECT 4, 'katy', 'S' UNION ALL
    SELECT 5, 'ivan', 'J' UNION ALL
    SELECT 6, 'inna', 'X'
) 
SELECT MIN([name]) AS name, MIN(surname) AS surname
FROM a
GROUP BY a.id


угу, name от одной записи surname от другой...
13 фев 20, 16:41    [22079408]     Ответить | Цитировать Сообщить модератору
 Re: Удаление дубликатов  [new]
entrypoint
Member

Откуда:
Сообщений: 227
msLex,

)))))

Tenya


Итог такой должен быть:

name | surname
--------------------
niko | L
inna | B
jane | A
katy | S
ivan | J
inna | X


name surname
---- -------
niko L
inna B
jane A
katy S
ivan J
inna X
13 фев 20, 16:45    [22079414]     Ответить | Цитировать Сообщить модератору
 Re: Удаление дубликатов  [new]
msLex
Member

Откуда:
Сообщений: 7620
Tenya
Добрый день.

Есть таблица вида

id | name | surname
--------------------
1 | niko | L
2 | inna | B
1 | niko | L
3 | jane | A
3 | jane | A
4 | katy | S
5 | ivan | J
6 | inna | X

В результате необходимо вывести данные только по столбцам name и surname, при этом, удалив дубликаты по id.
Т.е. результат такой:

name | surname
--------------------
niko | L
inna | B
jane | A
katy | S
ivan | J

Возможно ли сделать это с помощью distinct?
Если нет, какие еще есть варианты?



select distinct name, surname from table
13 фев 20, 16:51    [22079427]     Ответить | Цитировать Сообщить модератору
 Re: Удаление дубликатов  [new]
nullin
Member

Откуда: pullin
Сообщений: 113
msLex, а почему не так?
select name, surname
  from (select distinct id, name, surname from table) a

П.С. думаю автор сам не знает

Сообщение было отредактировано: 13 фев 20, 17:01
13 фев 20, 17:00    [22079440]     Ответить | Цитировать Сообщить модератору
 Re: Удаление дубликатов  [new]
msLex
Member

Откуда:
Сообщений: 7620
nullin
msLex, а почему не так?
select name, surname
  from (select distinct id, name, surname from table) a


П.С. думаю автор сам не знает

Может и так. По условию, оба варианта равноправны
13 фев 20, 17:05    [22079446]     Ответить | Цитировать Сообщить модератору
 Re: Удаление дубликатов  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7332
nullin,

для Инны этот трюк не сработает.
13 фев 20, 17:27    [22079461]     Ответить | Цитировать Сообщить модератору
 Re: Удаление дубликатов  [new]
msLex
Member

Откуда:
Сообщений: 7620
Владислав Колосов
nullin,

для Инны этот трюк не сработает.

а что не так с Инной (какой из двух, кстати)?
13 фев 20, 17:30    [22079463]     Ответить | Цитировать Сообщить модератору
 Re: Удаление дубликатов  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7332
msLex,

не заметил исправленный вариант...
13 фев 20, 17:32    [22079464]     Ответить | Цитировать Сообщить модератору
 Re: Удаление дубликатов  [new]
iap
Member

Откуда: Москва
Сообщений: 46948
Так нельзя что ли?
WITH CTE(N) AS(SELECT ROW_NUMBER()OVER(PARTITION BY name,surname ORDER BY 1/0) FROM T)
DELETE CTE WHERE N>1;
Был бы у таблицы уникальный ключ, решений было бы больше.
13 фев 20, 19:18    [22079530]     Ответить | Цитировать Сообщить модератору
 Re: Удаление дубликатов  [new]
msLex
Member

Откуда:
Сообщений: 7620
iap
Так нельзя что ли?
WITH CTE(N) AS(SELECT ROW_NUMBER()OVER(PARTITION BY name,surname ORDER BY 1/0) FROM T)
DELETE CTE WHERE N>1;

Был бы у таблицы уникальный ключ, решений было бы больше.

там не совсем "удалить", нужно просто в резалтсете убрать дубли.

Tenya
В результате необходимо вывести данные только по столбцам name и surname, при этом, удалив дубликаты по id.
13 фев 20, 20:20    [22079567]     Ответить | Цитировать Сообщить модератору
 Re: Удаление дубликатов  [new]
iap
Member

Откуда: Москва
Сообщений: 46948
msLex
iap
Так нельзя что ли?
WITH CTE(N) AS(SELECT ROW_NUMBER()OVER(PARTITION BY name,surname ORDER BY 1/0) FROM T)
DELETE CTE WHERE N>1;


Был бы у таблицы уникальный ключ, решений было бы больше.

там не совсем "удалить", нужно просто в резалтсете убрать дубли.

Tenya
В результате необходимо вывести данные только по столбцам name и surname, при этом, удалив дубликаты по id.
Tenya, наверно, сумеет написать вместо DELETE - SELECT с условием WHERE N=1?
Для этого ещё добавить в CTE через запятую нужные поля (или звёздочку)

Надеюсь также, что он перестанет называть SELECT удалением!

Сообщение было отредактировано: 13 фев 20, 22:17
13 фев 20, 22:16    [22079623]     Ответить | Цитировать Сообщить модератору
 Re: Удаление дубликатов  [new]
msLex
Member

Откуда:
Сообщений: 7620
iap
msLex
пропущено...

там не совсем "удалить", нужно просто в резалтсете убрать дубли.

пропущено...
Tenya, наверно, сумеет написать вместо DELETE - SELECT с условием WHERE N=1?
Для этого ещё добавить в CTE через запятую нужные поля (или звёздочку)

Надеюсь также, что он перестанет называть SELECT удалением!

Да не нужны там оконные функции, обычного дистинкта за глаза.
13 фев 20, 22:57    [22079644]     Ответить | Цитировать Сообщить модератору
 Re: Удаление дубликатов  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4309
Tenya
Добрый день.

Есть таблица вида

id | name | surname
--------------------
1 | niko | L
2 | inna | B
1 | niko | L
3 | jane | A
3 | jane | A
4 | katy | S
5 | ivan | J
6 | inna | X

В результате необходимо вывести данные только по столбцам name и surname, при этом, удалив дубликаты по id.
Т.е. результат такой:

name | surname
--------------------
niko | L
inna | B
jane | A
katy | S
ivan | J

Возможно ли сделать это с помощью distinct?
Если нет, какие еще есть варианты?


Вы определитесь, что вам в точности надо -- удалить дубликаты или вывести список уникальных значений? Это две разные задачи.

И та и другая решается через ROW_NUMBER().
14 фев 20, 08:41    [22079725]     Ответить | Цитировать Сообщить модератору
 Re: Удаление дубликатов  [new]
nullin
Member

Откуда: pullin
Сообщений: 113
iap
Так нельзя что ли?
WITH CTE(N) AS(SELECT ROW_NUMBER()OVER(PARTITION BY name,surname ORDER BY 1/0) FROM T)
DELETE CTE WHERE N>1;
Красивый стиль
14 фев 20, 10:10    [22079775]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить