【问题标题】:Grouping with partition and over in TSql在 Sql 中使用分区和 over 进行分组
【发布时间】:2016-10-08 15:57:37
【问题描述】:

我有一张简单的桌子

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() 来解决这个问题 并且通过使用 group by 但这似乎不正确(根本无法让它工作)

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

【问题讨论】:

  • Id 在设计上明显不同。你的意思是Name, Status, DateFinished没有改变?您还需要定义订单 - 通过 id 还是什么?
  • 没错。 :-)

标签: sql tsql group-by window-functions rowcount


【解决方案1】:

好的,假设它是按 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

【讨论】:

  • 真的很好。做到了我想要的,
  • 请注意,您很快就掌握了它,这完全是您的优点。很高兴回答包含示例数据脚本的问题。
猜你喜欢
  • 1970-01-01
  • 2018-11-03
  • 2021-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-14
  • 1970-01-01
  • 1970-01-01
  • 2018-12-07
相关资源
最近更新 更多