Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
Tsorion Member Откуда: Сообщений: 2 |
4. SQL. Дана таблица. Напишите запрос, чтобы найти дубликаты по полю Name. Напишите запрос, чтобы удалить дубликаты, должны остаться уникальные записи с максимальным идентификатором. Id Name 1 1 2 2 3 1 4 1 5 2 6 3 7 4 8 5 9 6 10 7 Если возможно - с объяснением (хотя бы кратко). Спасибо. |
12 апр 19, 15:54 [21860661] Ответить | Цитировать Сообщить модератору |
dvk92 Member Откуда: Сообщений: 41 |
Tsorion, 1. select id,count(name) from table group by id having count(name)>1 2. delete from table where id not in (select max(id) from (select id,count(name) from table group by id having count(name)>1)) |
12 апр 19, 16:01 [21860669] Ответить | Цитировать Сообщить модератору |
Гавриленко Сергей Алексеевич Member Откуда: Moscow Сообщений: 37155 |
2dvk92: 1. Нет 2. Нет 2Tsorion: https://www.sql.ru/forum/afsearch.aspx?s=??????? ?????????&submit=?????&bid=1 |
12 апр 19, 16:03 [21860671] Ответить | Цитировать Сообщить модератору |
dvk92 Member Откуда: Сообщений: 41 |
dvk92, 1 select name from (select name,count(id) from table group by id having count(id)>1) t1 |
12 апр 19, 16:13 [21860681] Ответить | Цитировать Сообщить модератору |
Гавриленко Сергей Алексеевич Member Откуда: Moscow Сообщений: 37155 |
|
||
12 апр 19, 16:37 [21860696] Ответить | Цитировать Сообщить модератору |
TaPaK Member Откуда: Kiev Сообщений: 6801 |
прям зажигают на каждом углуselect name,count(id) from table group by id |
12 апр 19, 16:41 [21860698] Ответить | Цитировать Сообщить модератору |
dvk92 Member Откуда: Сообщений: 41 |
Гавриленко Сергей Алексеевич, Простите, что? |
12 апр 19, 17:01 [21860711] Ответить | Цитировать Сообщить модератору |
Гавриленко Сергей Алексеевич Member Откуда: Moscow Сообщений: 37155 |
|
||
12 апр 19, 17:06 [21860716] Ответить | Цитировать Сообщить модератору |
dvk92 Member Откуда: Сообщений: 41 |
Как стоит группировать, если в таблице всего два поля? |
||||
12 апр 19, 17:18 [21860721] Ответить | Цитировать Сообщить модератору |
TaPaK Member Откуда: Kiev Сообщений: 6801 |
правильно |
||||
12 апр 19, 17:19 [21860722] Ответить | Цитировать Сообщить модератору |
msLex Member Откуда: Сообщений: 8730 |
|
||||
12 апр 19, 17:20 [21860723] Ответить | Цитировать Сообщить модератору |
Гавриленко Сергей Алексеевич Member Откуда: Moscow Сообщений: 37155 |
|
||||
12 апр 19, 17:22 [21860725] Ответить | Цитировать Сообщить модератору |
dvk92 Member Откуда: Сообщений: 41 |
Я слепой. |
||||||
12 апр 19, 17:38 [21860740] Ответить | Цитировать Сообщить модератору |
dklim.kzn Member Откуда: Казань Сообщений: 123 |
Delete table Where row_number() over (partition by name order by id) >1 Лень уточнять, можно ли оконную в where Если нет, то в подзапрос ее Delete t From table t Cross apply ( Select row_number() rn over (partition by name order by id) From table tt ) Where tt.rn>1 Видел мнение, что cross apply создает проблемы, так что если детские бллезни будут замечены - можно сделать через exists да или вообще пересечением |
13 апр 19, 07:24 [21861011] Ответить | Цитировать Сообщить модератору |
dklim.kzn Member Откуда: Казань Сообщений: 123 |
Поправка Delete t From table t Cross apply ( Select row_number() over (partition by name order by id) rn From table tt ) Where tt.rn>1 |
13 апр 19, 07:25 [21861012] Ответить | Цитировать Сообщить модератору |
dklim.kzn Member Откуда: Казань Сообщений: 123 |
а блин)) Delete t From table t Cross apply ( Select row_number() over (order by id) rn From table tt where tt.name=t.name ) ttt Where ttt.rn>1 |
13 апр 19, 07:42 [21861014] Ответить | Цитировать Сообщить модератору |
Kopelly Member Откуда: Красноярск Сообщений: 289 |
Удалит все имена у которых есть повторы (ни одного экземпляра не оставит). |
||
17 апр 19, 04:50 [21864358] Ответить | Цитировать Сообщить модератору |
982183 Member Откуда: VL Сообщений: 3374 |
Не легче ли сразу выделить результирующую таблицу?select max(id), name from table group by name Или надо именно удалить лишнее? |
17 апр 19, 07:36 [21864378] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31784 |
|
||||
17 апр 19, 10:20 [21864529] Ответить | Цитировать Сообщить модератору |
dklim.kzn Member Откуда: Казань Сообщений: 123 |
мдя, не пишите кода под мухой и на отходных) delete t from table t, (select name, max(id) i) f where t.name=f.name and t.id<>f.i |
17 апр 19, 10:26 [21864536] Ответить | Цитировать Сообщить модератору |
TaPaK Member Откуда: Kiev Сообщений: 6801 |
вам в вообще это не рекомендуется |
||
17 апр 19, 10:27 [21864538] Ответить | Цитировать Сообщить модератору |
Kopelly Member Откуда: Красноярск Сообщений: 289 |
Ну убедится что в ttt для этого t.name есть такие же имена с rn>1, и удалит запись из t (которые не пронумерованы и не завязаны по id) |
||
17 апр 19, 10:44 [21864570] Ответить | Цитировать Сообщить модератору |
uaggster Member Откуда: Сообщений: 960 |
Народ, ну в FAQ ж есть!if OBJECT_ID('tempdb..#t') is not null drop table #t Create table #t (Id int, [Name] int) insert into #t (Id, [Name]) Values (1, 1) ,(2, 2) ,(3, 1) ,(4, 1) ,(5, 2) ,(6, 3) ,(7, 4) ,(8, 5) ,(9, 6) ,(10, 7) -- Поиск Select a.Id [Parent_Id], a.[Name] [Parent_Name], b.Id [Double_Id], b.[Name] [Doudle_Name] from #t a inner join #t b on a.Name = b.Name and a.Id > b.Id Order by a.Name, a.Id -- Удаление ;With tt as (Select *, ROW_NUMBER() over (partition by [Name] order by Id DESC, 1/0 ) N from #t) Delete from tt Where N>1 Select * from #t |
17 апр 19, 13:44 [21864940] Ответить | Цитировать Сообщить модератору |
dklim.kzn Member Откуда: Казань Сообщений: 123 |
TaPaK, Ну дописали бы, раз уж взялись комментить) delete t from table t, (select name, max(id) i from table tt) f where t.name=f.name and t.id<>f.i |
17 апр 19, 22:31 [21865611] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |