Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
гость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] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104751 |
Одну какую именно ? |
||
14 янв 16, 11:31 [18677028] Ответить | Цитировать Сообщить модератору |
гость123
Guest |
в принципе без разницы, но допустим с большим Id |
14 янв 16, 11:40 [18677100] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104751 |
Тогда пронумеруйте ваши записи в окне по EmpId и возростанию Id И возьмите все записи с номером 1 |
||
14 янв 16, 11:44 [18677142] Ответить | Цитировать Сообщить модератору |
Mairos Member Откуда: Сообщений: 555 |
delete from test_duplicate where id not in( select min(id) from TEST_DUPLICATE group by EmpId ) |
||
14 янв 16, 11:56 [18677231] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47052 |
гость123, что такое "отсечь"? |
14 янв 16, 12:00 [18677248] Ответить | Цитировать Сообщить модератору |
гость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] Ответить | Цитировать Сообщить модератору |
Mairos Member Откуда: Сообщений: 555 |
iap, я понял как "удалить". А если просто "показать", то тогда можно просто заменить "delete ", на "select * " )) |
14 янв 16, 12:18 [18677389] Ответить | Цитировать Сообщить модератору |
wizli Member Откуда: Minsk Сообщений: 270 |
Если я правильно понял задачу, то посмотрите в сторону top with ties. Это должно вам помочь. |
14 янв 16, 12:34 [18677538] Ответить | Цитировать Сообщить модератору |
гость123
Guest |
Mairos спасибо |
14 янв 16, 12:49 [18677666] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47052 |
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] Ответить | Цитировать Сообщить модератору |
Mairos Member Откуда: Сообщений: 555 |
iap, тоже вариант )) |
14 янв 16, 13:31 [18678051] Ответить | Цитировать Сообщить модератору |
гость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] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104751 |
или |
||
14 янв 16, 17:10 [18679627] Ответить | Цитировать Сообщить модератору |
wizli Member Откуда: Minsk Сообщений: 270 |
select top(1) with ties * from dbo.TD1 order by dense_rank() over (partition by [EmpId] order by ID) |
||
14 янв 16, 17:19 [18679695] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47052 |
|
||
14 янв 16, 17:24 [18679741] Ответить | Цитировать Сообщить модератору |
гость123
Guest |
спасибо господа |
14 янв 16, 17:54 [18679986] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |