Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Помогите написать два запроса.  [new]
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]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать два запроса.  [new]
dvk92
Member

Откуда:
Сообщений: 11
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]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать два запроса.  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36269
2dvk92:

1. Нет
2. Нет

2Tsorion:

https://www.sql.ru/forum/afsearch.aspx?s=??????? ?????????&submit=?????&bid=1
12 апр 19, 16:03    [21860671]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать два запроса.  [new]
dvk92
Member

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

1
select name
from (select name,count(id)
from table
group by id
having count(id)>1) t1
12 апр 19, 16:13    [21860681]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать два запроса.  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36269
dvk92
dvk92,

1
select name
from (select name,count(id)
from table
group by id
having count(id)>1) t1
Завязывайте группировать по одному полю в надежде найти там какий-то дубликаты по другому.
12 апр 19, 16:37    [21860696]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать два запроса.  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6376
прям зажигают на каждом углу

select name,count(id) from table group by id
12 апр 19, 16:41    [21860698]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать два запроса.  [new]
dvk92
Member

Откуда:
Сообщений: 11
Гавриленко Сергей Алексеевич,

Простите, что?
12 апр 19, 17:01    [21860711]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать два запроса.  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36269
dvk92
Гавриленко Сергей Алексеевич,

Простите, что?
Какое именно слово вам не понятно?
12 апр 19, 17:06    [21860716]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать два запроса.  [new]
dvk92
Member

Откуда:
Сообщений: 11
Гавриленко Сергей Алексеевич
dvk92
Гавриленко Сергей Алексеевич,

Простите, что?
Какое именно слово вам не понятно?


Как стоит группировать, если в таблице всего два поля?
12 апр 19, 17:18    [21860721]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать два запроса.  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6376
dvk92
Гавриленко Сергей Алексеевич
пропущено...
Какое именно слово вам не понятно?


Как стоит группировать, если в таблице всего два поля?

правильно
12 апр 19, 17:19    [21860722]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать два запроса.  [new]
msLex
Member

Откуда:
Сообщений: 6245
dvk92
Как стоит группировать, если в таблице всего два поля?


dvk92
select name
from (select name,count(id)
from table
group by id
having count(id)>1) t1
12 апр 19, 17:20    [21860723]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать два запроса.  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36269
dvk92
Гавриленко Сергей Алексеевич
пропущено...
Какое именно слово вам не понятно?


Как стоит группировать, если в таблице всего два поля?
В таблице два поля. По id группировать неправильно. Хмм... Что же делать? По какому полю группировать? Тут консилиум нужен.
12 апр 19, 17:22    [21860725]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать два запроса.  [new]
dvk92
Member

Откуда:
Сообщений: 11
msLex
dvk92
Как стоит группировать, если в таблице всего два поля?


dvk92
select name
from (select name,count(id)
from table
group by id
having count(id)>1) t1


Я слепой.
12 апр 19, 17:38    [21860740]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать два запроса.  [new]
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]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать два запроса.  [new]
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]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать два запроса.  [new]
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]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать два запроса.  [new]
Kopelly
Member

Откуда: Красноярск
Сообщений: 281
dklim.kzn
а блин))

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


Удалит все имена у которых есть повторы (ни одного экземпляра не оставит).
17 апр 19, 04:50    [21864358]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать два запроса.  [new]
982183
Member

Откуда: VL
Сообщений: 2957
Не легче ли сразу выделить результирующую таблицу?
select max(id), name from table group by name

Или надо именно удалить лишнее?
17 апр 19, 07:36    [21864378]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать два запроса.  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 28723
Kopelly
dklim.kzn
а блин))

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


Удалит все имена у которых есть повторы (ни одного экземпляра не оставит).
Нет, там же условие "номер записи из набора одинаковых > 1"
17 апр 19, 10:20    [21864529]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать два запроса.  [new]
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]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать два запроса.  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6376
dklim.kzn
мдя, не пишите кода под мухой и на отходных)

delete t
from table t,
(select name, max(id) i) f
where t.name=f.name
and t.id<>f.i

вам в вообще это не рекомендуется
17 апр 19, 10:27    [21864538]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать два запроса.  [new]
Kopelly
Member

Откуда: Красноярск
Сообщений: 281
alexeyvg
Нет, там же условие "номер записи из набора одинаковых > 1"


Ну убедится что в ttt для этого t.name есть такие же имена с rn>1, и удалит запись из t (которые не пронумерованы и не завязаны по id)
17 апр 19, 10:44    [21864570]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать два запроса.  [new]
uaggster
Member

Откуда:
Сообщений: 619
Народ, ну в 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]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать два запроса.  [new]
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 Ответить