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

Id EmpId ObjId PostId DepId
1-----1--------1-------1-------1
2-----1--------1-------2-------1
3-----2--------1-------1-------1
4-----3--------2-------2-------2

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

Id EmpId ObjId PostId DepId
1-----1--------1-------1-------1
3-----2--------1-------1-------1
4-----3--------2-------2-------2

помогите пажалюсто с запросом

спасибо
14 янв 16, 11:30    [18677018]     Ответить | Цитировать Сообщить модератору
 Re: запрос. отсеч дубликаты  [new]
Glory
Member

Откуда:
Сообщений: 104751
гость123
нужно отсечь записи с одинаковыми EmpId, оставив только одну

Одну какую именно ?
14 янв 16, 11:31    [18677028]     Ответить | Цитировать Сообщить модератору
 Re: запрос. отсеч дубликаты  [new]
гость123
Guest
в принципе без разницы, но допустим с большим Id
14 янв 16, 11:40    [18677100]     Ответить | Цитировать Сообщить модератору
 Re: запрос. отсеч дубликаты  [new]
Glory
Member

Откуда:
Сообщений: 104751
гость123
в принципе без разницы, но допустим с большим Id

Тогда пронумеруйте ваши записи в окне по EmpId и возростанию Id
И возьмите все записи с номером 1
14 янв 16, 11:44    [18677142]     Ответить | Цитировать Сообщить модератору
 Re: запрос. отсеч дубликаты  [new]
Mairos
Member

Откуда:
Сообщений: 555
гость123
Здравствуйте господа
такая вот таблица

Id EmpId ObjId PostId DepId
1-----1--------1-------1-------1
2-----1--------1-------2-------1
3-----2--------1-------1-------1
4-----3--------2-------2-------2

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

Id EmpId ObjId PostId DepId
1-----1--------1-------1-------1
3-----2--------1-------1-------1
4-----3--------2-------2-------2

помогите пажалюсто с запросом

спасибо


delete from test_duplicate
where id not in(
select min(id)
        from TEST_DUPLICATE
        group by EmpId ) 
14 янв 16, 11:56    [18677231]     Ответить | Цитировать Сообщить модератору
 Re: запрос. отсеч дубликаты  [new]
iap
Member

Откуда: Москва
Сообщений: 47052
гость123,

что такое "отсечь"?
14 янв 16, 12:00    [18677248]     Ответить | Цитировать Сообщить модератору
 Re: запрос. отсеч дубликаты  [new]
гость123
Guest
кажется я чтото не правильно объяснил.
мне нужно запросом из набора записей

Id EmpId ObjId PostId DepId
1-----1--------1-------1-------1
2-----1--------1-------2-------1
3-----2--------1-------1-------1
4-----3--------2-------2-------2

получить набор записей

Id EmpId ObjId PostId DepId
1-----1--------1-------1-------1
3-----2--------1-------1-------1
4-----3--------2-------2-------2
14 янв 16, 12:17    [18677379]     Ответить | Цитировать Сообщить модератору
 Re: запрос. отсеч дубликаты  [new]
Mairos
Member

Откуда:
Сообщений: 555
iap, я понял как "удалить". А если просто "показать", то тогда можно просто заменить "delete ", на "select * " ))
14 янв 16, 12:18    [18677389]     Ответить | Цитировать Сообщить модератору
 Re: запрос. отсеч дубликаты  [new]
wizli
Member

Откуда: Minsk
Сообщений: 270
Если я правильно понял задачу, то посмотрите в сторону top with ties. Это должно вам помочь.
14 янв 16, 12:34    [18677538]     Ответить | Цитировать Сообщить модератору
 Re: запрос. отсеч дубликаты  [new]
гость123
Guest
Mairos спасибо
14 янв 16, 12:49    [18677666]     Ответить | Цитировать Сообщить модератору
 Re: запрос. отсеч дубликаты  [new]
iap
Member

Откуда: Москва
Сообщений: 47052
Mairos
iap, я понял как "удалить". А если просто "показать", то тогда можно просто заменить "delete ", на "select * " ))
Удалить:
WITH CTE(N) AS(SELECT ROW_NUMBER()OVER(PARTITION BY EmpId ORDER BY id) FROM test_duplicate)
DELETE CTE WHERE N>1;
Показать:
WITH CTE AS(SELECT N=ROW_NUMBER()OVER(PARTITION BY EmpId ORDER BY id),* FROM test_duplicate)
SELECT * FROM CTE WHERE N>1;
14 янв 16, 13:26    [18677990]     Ответить | Цитировать Сообщить модератору
 Re: запрос. отсеч дубликаты  [new]
Mairos
Member

Откуда:
Сообщений: 555
iap, тоже вариант ))
14 янв 16, 13:31    [18678051]     Ответить | Цитировать Сообщить модератору
 Re: запрос. отсеч дубликаты  [new]
гость123
Guest
если правильно понимаю ситуацию, правилныи запрос предложил Mairos.
остальные не до конца дают результат, или ...
USE [tempdb]
GO
CREATE TABLE [dbo].[TD1](
	[Id] [int] IDENTITY(1,1) NOT NULL,
	[EmpId] [int] NULL,
	[ObjId] [int] NULL,
	[PostId] [int] NULL,
	[DepId] [int] NULL
) ON [PRIMARY]

GO
INSERT [dbo].[TD1] ([EmpId], [ObjId], [PostId], [DepId]) VALUES (1, 1, 1, 1)
INSERT [dbo].[TD1] ([EmpId], [ObjId], [PostId], [DepId]) VALUES (1, 2, 1, 1)
INSERT [dbo].[TD1] ([EmpId], [ObjId], [PostId], [DepId]) VALUES (2, 1, 1, 1)
INSERT [dbo].[TD1] ([EmpId], [ObjId], [PostId], [DepId]) VALUES (3, 1, 1, 1)
INSERT [dbo].[TD1] ([EmpId], [ObjId], [PostId], [DepId]) VALUES (3, 2, 1, 1)
INSERT [dbo].[TD1] ([EmpId], [ObjId], [PostId], [DepId]) VALUES (4, 1, 1, 1)
INSERT [dbo].[TD1] ([EmpId], [ObjId], [PostId], [DepId]) VALUES (2, 2, 2, 2)
INSERT [dbo].[TD1] ([EmpId], [ObjId], [PostId], [DepId]) VALUES (5, 2, 1, 1)
GO
select *
from TD1

select *
from TD1
where Id in(
select min(Id)
        from TD1
        group by EmpId ) 

select top(1) with TIES *
from TD1
order by EmpId
;
WITH CTE AS(SELECT N=ROW_NUMBER()OVER(PARTITION BY EmpId ORDER BY id),* FROM TD1)
SELECT * FROM CTE WHERE N>1;
DROP TABLE [dbo].[TD1]
GO
14 янв 16, 17:08    [18679614]     Ответить | Цитировать Сообщить модератору
 Re: запрос. отсеч дубликаты  [new]
Glory
Member

Откуда:
Сообщений: 104751
гость123
остальные не до конца дают результат, или ...

или
14 янв 16, 17:10    [18679627]     Ответить | Цитировать Сообщить модератору
 Re: запрос. отсеч дубликаты  [new]
wizli
Member

Откуда: Minsk
Сообщений: 270
гость123
остальные не до конца дают результат, или ...

select	top(1) with ties *
from	dbo.TD1
order by dense_rank() over (partition by [EmpId] order by ID)
14 янв 16, 17:19    [18679695]     Ответить | Цитировать Сообщить модератору
 Re: запрос. отсеч дубликаты  [new]
iap
Member

Откуда: Москва
Сообщений: 47052
гость123
остальные не до конца дают результат
Замените ROW_NUMBER на RANK
14 янв 16, 17:24    [18679741]     Ответить | Цитировать Сообщить модератору
 Re: запрос. отсеч дубликаты  [new]
гость123
Guest
спасибо господа
14 янв 16, 17:54    [18679986]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить