在TSql中使用分区和over进行分组

在TSql中使用分区和over进行分组,sql,tsql,group-by,window-functions,rowcount,Sql,Tsql,Group By,Window Functions,Rowcount,我有一张简单的桌子 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

我有一张简单的桌子

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
如果我运行它,我希望id为5和7的记录应该被排除,因为它们在上一行的所选集合中不会更改。 我有一个解决这个问题的办法,在分区上使用,ROW_NUMBER() 通过使用“分组方式”,但这似乎是不正确的(根本无法使其工作)

当应根据值更改而不是其包含的值对其进行分组时,如何对其进行分组? 有什么建议可以解决这个问题吗?
我的最终目标也是尝试将它转换为linq到实体…

好的,假设它是按id排序的

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

Id在设计上完全不同。你是说,
名称、状态、完成日期
没有更改吗?您还需要通过id或什么来定义订单?这是正确的。:-)非常好。做了我想做的,注意你做得很好,这完全是你的优点。很高兴回答包含示例数据脚本的问题。