Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Удаление дубликатов / 20 сообщений из 20, страница 1 из 1
13.02.2020, 16:07
    #39926321
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?
Если нет, какие еще есть варианты?
...
Рейтинг: 0 / 0
13.02.2020, 16:16
    #39926325
1C Developer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление дубликатов
Добрый:

ROW_NUMBER()
...
Рейтинг: 0 / 0
13.02.2020, 16:18
    #39926327
entrypoint
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление дубликатов
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 в итоговом рекордсете ?
Вы точно описываете проблему ?
...
Рейтинг: 0 / 0
13.02.2020, 16:29
    #39926328
Tenya
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление дубликатов
entrypoint, проблема описана верно, а вот при написании результата промашка вышла. Спасибо за замечание.

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

name | surname
--------------------
niko | L
inna | B
jane | A
katy | S
ivan | J
inna | X
...
Рейтинг: 0 / 0
13.02.2020, 16:38
    #39926334
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление дубликатов
Tenya,

селект дубли в таблицу хэвинг счетчик > 1
удалить top (1) где индекс в таблице дублей
...
Рейтинг: 0 / 0
13.02.2020, 16:39
    #39926336
entrypoint
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление дубликатов
Tenya,

или
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
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


или
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
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;
...
Рейтинг: 0 / 0
13.02.2020, 16:41
    #39926338
msLex
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление дубликатов
entrypoint
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
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 от другой...
...
Рейтинг: 0 / 0
13.02.2020, 16:45
    #39926342
entrypoint
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление дубликатов
msLex,

)))))

Tenya


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

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


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
name surname
---- -------
niko L
inna B
jane A
katy S
ivan J
inna X
...
Рейтинг: 0 / 0
13.02.2020, 16:51
    #39926351
msLex
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление дубликатов
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?
Если нет, какие еще есть варианты?



Код: sql
1.
select distinct name, surname from table
...
Рейтинг: 0 / 0
13.02.2020, 17:00
    #39926355
nullin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление дубликатов
msLex, а почему не так?
Код: sql
1.
2.
select name, surname
  from (select distinct id, name, surname from table) a


П.С. думаю автор сам не знает
...
Рейтинг: 0 / 0
13.02.2020, 17:05
    #39926357
msLex
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление дубликатов
nullin
msLex, а почему не так?
Код: sql
1.
2.
select name, surname
  from (select distinct id, name, surname from table) a



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

Может и так. По условию, оба варианта равноправны
...
Рейтинг: 0 / 0
13.02.2020, 17:27
    #39926361
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление дубликатов
nullin,

для Инны этот трюк не сработает.
...
Рейтинг: 0 / 0
13.02.2020, 17:30
    #39926362
msLex
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление дубликатов
Владислав Колосов
nullin,

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

а что не так с Инной (какой из двух, кстати)?
...
Рейтинг: 0 / 0
13.02.2020, 17:32
    #39926363
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление дубликатов
msLex,

не заметил исправленный вариант...
...
Рейтинг: 0 / 0
13.02.2020, 19:18
    #39926405
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление дубликатов
Так нельзя что ли?
Код: sql
1.
2.
WITH CTE(N) AS(SELECT ROW_NUMBER()OVER(PARTITION BY name,surname ORDER BY 1/0) FROM T)
DELETE CTE WHERE N>1;

Был бы у таблицы уникальный ключ, решений было бы больше.
...
Рейтинг: 0 / 0
13.02.2020, 20:20
    #39926435
msLex
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление дубликатов
iap
Так нельзя что ли?
Код: sql
1.
2.
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.
...
Рейтинг: 0 / 0
13.02.2020, 22:16
    #39926473
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление дубликатов
msLex
iap
Так нельзя что ли?
Код: sql
1.
2.
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 удалением!
...
Рейтинг: 0 / 0
13.02.2020, 22:57
    #39926486
msLex
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление дубликатов
iap
msLex
пропущено...

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

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

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

Да не нужны там оконные функции, обычного дистинкта за глаза.
...
Рейтинг: 0 / 0
14.02.2020, 08:41
    #39926548
a_voronin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление дубликатов
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().
...
Рейтинг: 0 / 0
14.02.2020, 10:10
    #39926571
nullin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление дубликатов
iap
Так нельзя что ли?
Код: sql
1.
2.
WITH CTE(N) AS(SELECT ROW_NUMBER()OVER(PARTITION BY name,surname ORDER BY 1/0) FROM T)
DELETE CTE WHERE N>1;

Красивый стиль
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Удаление дубликатов / 20 сообщений из 20, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]