Группировка с разделом и выше в TSql

у меня простая таблица

CREATE TABLE [dbo].[Tooling](
[Id] [int] IDENTITY(1,1) NOT NULL,
[Name] [nvarchar](50) NOT NULL,
[Status] [int] NOT NULL,
[DateFinished] [datetime] NULL,
[Tooling] [nvarchar](50) NULL,
[Updated] [datetime] NULL,

 ) ON [PRIMARY]

со следующими значениями

SET IDENTITY_INSERT [dbo].[Tooling] ON 

GO
INSERT [dbo].[Tooling] ([Id], [Name], [Status], [DateFinished], [Tooling], [Updated]) VALUES (1, N'Large', 0, NULL, NULL, CAST(N'2015-05-05 00:00:00.000' AS DateTime))
GO
INSERT [dbo].[Tooling] ([Id], [Name], [Status], [DateFinished], [Tooling], [Updated]) VALUES (2, N'Large', 1, NULL, N'1', CAST(N'2015-05-10 00:00:00.000' AS DateTime))
GO
INSERT [dbo].[Tooling] ([Id], [Name], [Status], [DateFinished], [Tooling], [Updated]) VALUES (3, N'Small', 0, NULL, N'2', CAST(N'2015-05-11 00:00:00.000' AS DateTime))
GO
INSERT [dbo].[Tooling] ([Id], [Name], [Status], [DateFinished], [Tooling], [Updated]) VALUES (4, N'Large', 2, NULL, N'1', CAST(N'2015-05-12 00:00:00.000' AS DateTime))
GO
INSERT [dbo].[Tooling] ([Id], [Name], [Status], [DateFinished], [Tooling], [Updated]) VALUES (5, N'Large', 2, NULL, N'2', CAST(N'2015-05-12 00:00:00.000' AS DateTime))
GO
INSERT [dbo].[Tooling] ([Id], [Name], [Status], [DateFinished], [Tooling], [Updated]) VALUES (6, N'Large', 1, NULL, N'1', CAST(N'2015-05-13 00:00:00.000' AS DateTime))
GO
INSERT [dbo].[Tooling] ([Id], [Name], [Status], [DateFinished], [Tooling], [Updated]) VALUES (7, N'Large', 1, NULL, N'2', CAST(N'2015-05-14 00:00:00.000' AS DateTime))
GO
INSERT [dbo].[Tooling] ([Id], [Name], [Status], [DateFinished], [Tooling], [Updated]) VALUES (8, N'Small', 1, CAST(N'2015-05-15 00:00:00.000' AS DateTime), N'2', CAST(N'2015-05-15 00:00:00.000' AS DateTime))
GO
SET IDENTITY_INSERT [dbo].[Tooling] OFF

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

SELECT         Id, Name, Status, DateFinished
FROM          Tooling t order by t.id

Если я запущу это, я бы хотел, чтобы записи с идентификаторами 5 и 7 были исключены, поскольку они не меняются в выбранном наборе из предыдущей строки. У меня была идея решить эту проблему, используя ROW_NUMBER() над разделом и используя группу, но это кажется неправильным (не удалось заставить его работать вообще)

Как мне сгруппировать его, когда его следует сгруппировать по изменению значения, а не по содержащемуся в нем значению? Любые предложения, чтобы решить эту проблему? Моя конечная цель также попытаться преобразовать это в linq для объектов...


person Jerker Pihl    schedule 08.06.2016    source источник
comment
Идентификатор определенно отличается по дизайну. Вы имеете в виду, что Name, Status, DateFinished не изменились? Так же нужно определить порядок - по id или как?   -  person Serg    schedule 08.06.2016
comment
Это правильно. :-)   -  person Jerker Pihl    schedule 08.06.2016


Ответы (1)


Хорошо, предположим, что он заказан по идентификатору

select * 
from (
  select *, rng = row_number() over (partition by grp order by id)
  from (
    select *, grp = row_number() over (order by id) - row_number() over (partition by Name, Status, DateFinished order by id)
    from tooling ) g
  ) gn
where rng = 1
order by id
person Serg    schedule 08.06.2016
comment
Действительно мило. Сделал именно то, что я хотел, - person Jerker Pihl; 08.06.2016
comment
Обратите внимание, что вы получили это быстро, и это полностью ваша заслуга. На вопрос, содержащий образец скрипта данных, приятно ответить. - person Serg; 08.06.2016