2016-03-08 3 views
0

Скажем, у меня есть 5 обрабатывающих центров (Workcenter 1, Workcenter 2, Workcenter 3, Workcenter 4, Workcenter 5)TSQL - Удалить все строки, за исключением 1 на группу

Каждый Workcenter имеет несколько рядов нот, которые упорядочены по дата ввода данных. Я хотел бы удалить все строки на рабочий центр, кроме строки данных, которая была введена последним.

Если мои столбцы: ID | Workcenter | Примечание. Log_Date

Как бы я это сделал?

Мой код только дает мне самую последнюю запись заметки для всей таблицы, но я хочу один на каждый рабочий центр.

Это то, что я прямо сейчас:

DELETE FROM @Table 
WHERE ID NOT IN (SELECT TOP 1 ID FROM @Table 
      GROUP BY Workcenter, ID 
      ORDER BY Log_Date DESC) 

ответ

1

попробовать это:

delete t1 from table t1 
where not exists 
(select 1 from 
     (select workcenter,max(log_date)as log_date from table group by workcenter) t2 
     where t1.workcenter = t2.workcenter and t1.log_date = t2.log_date 
) 

использование существует подзапрос, чтобы получить максимальную log_date для каждого Workcenter, а затем подключить их к столу.

+0

Это сработало! Спасибо! – user2308700

0
using CTE we can achieve this: 

;WITH cte AS 
(SELECT ROW_NUMBER() OVER (PARTITION BY name ORDER BY createdate DESC) AS rowno, * FROM workgroups) 
DELETE FROM cte WHERE rowno !=1; 

CREATE TABLE workgroups(id INT IDENTITY(1,1),name VARCHAR(50), createdate DATETIME DEFAULT GETDATE()) 

INSERT [dbo].[workgroups] ([id], [name], [createdate]) VALUES (1, N'workgroup1', CAST(0x0000A60F011F7840 AS DateTime)) 
INSERT [dbo].[workgroups] ([id], [name], [createdate]) VALUES (2, N'workgroup1', CAST(0x0000A60F011F7F8E AS DateTime)) 
INSERT [dbo].[workgroups] ([id], [name], [createdate]) VALUES (3, N'workgroup1', CAST(0x0000A60F011F8728 AS DateTime)) 
INSERT [dbo].[workgroups] ([id], [name], [createdate]) VALUES (4, N'workgroup2', CAST(0x0000A60F011F92B9 AS DateTime)) 
INSERT [dbo].[workgroups] ([id], [name], [createdate]) VALUES (5, N'workgroup2', CAST(0x0000A60F011F97C0 AS DateTime)) 
INSERT [dbo].[workgroups] ([id], [name], [createdate]) VALUES (6, N'workgroup3', CAST(0x0000A60F011FA443 AS DateTime)) 
INSERT [dbo].[workgroups] ([id], [name], [createdate]) VALUES (7, N'workgroup3', CAST(0x0000A60F011FA73B AS DateTime)) 
INSERT [dbo].[workgroups] ([id], [name], [createdate]) VALUES (8, N'workgroup3', CAST(0x0000A60F011FA9FB AS DateTime)) 

SELECT ROW_NUMBER() OVER (PARTITION BY name ORDER BY createdate DESC) AS rowno, * FROM workgroups 


;WITH cte AS 
(SELECT ROW_NUMBER() OVER (PARTITION BY name ORDER BY createdate DESC) AS rowno, * FROM workgroups) 
DELETE FROM cte WHERE rowno !=1;