【问题标题】:Update End Date from next rows Start Date - millions of rows从下一行更新结束日期开始日期 - 数百万行
【发布时间】:2019-12-22 17:38:44
【问题描述】:

如果 EndDate 值与每个 VisitID 的下一个 StartDate 值不匹配,我该如何更新它?请记住,该表包含 400 万个个人 VisitID 和总共超过 1000 万条记录。

例如,对于 ID 3362144 和 VisitID 1159828,结束日期应为 2019-03-26 10:29:54.297 而不是 2019-03-25 23:29:54.43

我的以下 SQL 给出了正确的结果,但我想知道其他人如何使用更新子句跨 1000 万行执行此操作?

SELECT *,
  ISNULL(
        LEAD( StartDate, 1 ) 
            OVER( PARTITION BY VisitID ORDER BY StartDate ) 
            ,
        EndDate) AS NewEndDate
from testdata2

测试数据

CREATE TABLE [dbo].[testdata2](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [VisitId] [int] NOT NULL,
    [StartDate] [datetime] NULL,
    [EndDate] [datetime] NULL
)

GO
SET IDENTITY_INSERT [dbo].[testdata2] ON 
GO
INSERT [dbo].[testdata2] ([Id], [VisitId], [StartDate], [EndDate]) VALUES (3362144, 1159828, CAST(N'2019-03-26T10:28:38.663' AS DateTime), CAST(N'2019-03-25T23:29:54.243' AS DateTime))
GO
INSERT [dbo].[testdata2] ([Id], [VisitId], [StartDate], [EndDate]) VALUES (3362147, 1159828, CAST(N'2019-03-26T10:29:54.297' AS DateTime), CAST(N'2019-03-25T23:30:51.300' AS DateTime))
GO
INSERT [dbo].[testdata2] ([Id], [VisitId], [StartDate], [EndDate]) VALUES (3362148, 1159828, CAST(N'2019-03-26T10:30:51.350' AS DateTime), CAST(N'2019-03-25T23:34:51.240' AS DateTime))
GO
INSERT [dbo].[testdata2] ([Id], [VisitId], [StartDate], [EndDate]) VALUES (3362150, 1159828, CAST(N'2019-03-26T10:34:51.287' AS DateTime), CAST(N'2019-03-25T23:37:10.980' AS DateTime))
GO
INSERT [dbo].[testdata2] ([Id], [VisitId], [StartDate], [EndDate]) VALUES (3362152, 1159828, CAST(N'2019-03-26T10:37:11.030' AS DateTime), CAST(N'2019-03-25T23:37:29.167' AS DateTime))
GO
INSERT [dbo].[testdata2] ([Id], [VisitId], [StartDate], [EndDate]) VALUES (3362154, 1159828, CAST(N'2019-03-26T10:37:29.213' AS DateTime), CAST(N'2019-03-25T23:37:42.407' AS DateTime))
GO
INSERT [dbo].[testdata2] ([Id], [VisitId], [StartDate], [EndDate]) VALUES (3362155, 1159828, CAST(N'2019-03-26T10:37:42.453' AS DateTime), CAST(N'2019-03-25T23:46:45.230' AS DateTime))
GO
INSERT [dbo].[testdata2] ([Id], [VisitId], [StartDate], [EndDate]) VALUES (3362170, 1159828, CAST(N'2019-03-26T10:46:45.500' AS DateTime), CAST(N'2019-03-25T23:51:26.163' AS DateTime))
GO
INSERT [dbo].[testdata2] ([Id], [VisitId], [StartDate], [EndDate]) VALUES (3362175, 1159828, CAST(N'2019-03-26T10:51:26.220' AS DateTime), CAST(N'2019-03-26T00:19:34.670' AS DateTime))
GO
INSERT [dbo].[testdata2] ([Id], [VisitId], [StartDate], [EndDate]) VALUES (3362195, 1159828, CAST(N'2019-03-26T11:19:34.723' AS DateTime), CAST(N'2019-03-26T11:21:19.270' AS DateTime))
GO
INSERT [dbo].[testdata2] ([Id], [VisitId], [StartDate], [EndDate]) VALUES (3449893, 1196705, CAST(N'2019-12-18T13:43:38.183' AS DateTime), CAST(N'2019-12-18T02:44:17.273' AS DateTime))
GO
INSERT [dbo].[testdata2] ([Id], [VisitId], [StartDate], [EndDate]) VALUES (3449895, 1196705, CAST(N'2019-12-18T13:44:16.787' AS DateTime), CAST(N'2019-12-18T02:51:07.277' AS DateTime))
GO
INSERT [dbo].[testdata2] ([Id], [VisitId], [StartDate], [EndDate]) VALUES (3449900, 1196705, CAST(N'2019-12-18T13:51:06.843' AS DateTime), CAST(N'2019-12-18T14:01:42.687' AS DateTime))
GO
INSERT [dbo].[testdata2] ([Id], [VisitId], [StartDate], [EndDate]) VALUES (3449982, 1196741, CAST(N'2019-12-18T15:46:07.727' AS DateTime), CAST(N'2019-12-18T04:47:04.317' AS DateTime))
GO
INSERT [dbo].[testdata2] ([Id], [VisitId], [StartDate], [EndDate]) VALUES (3449989, 1196741, CAST(N'2019-12-18T15:47:03.820' AS DateTime), CAST(N'2019-12-18T04:55:20.937' AS DateTime))
GO
INSERT [dbo].[testdata2] ([Id], [VisitId], [StartDate], [EndDate]) VALUES (3449996, 1196741, CAST(N'2019-12-18T15:55:20.450' AS DateTime), CAST(N'2019-12-18T16:24:08.480' AS DateTime))
GO
INSERT [dbo].[testdata2] ([Id], [VisitId], [StartDate], [EndDate]) VALUES (3450022, 1196754, CAST(N'2019-12-18T16:32:39.527' AS DateTime), CAST(N'2019-12-18T05:33:38.833' AS DateTime))
GO
INSERT [dbo].[testdata2] ([Id], [VisitId], [StartDate], [EndDate]) VALUES (3450024, 1196754, CAST(N'2019-12-18T16:33:38.350' AS DateTime), CAST(N'2019-12-18T06:20:30.327' AS DateTime))
GO
INSERT [dbo].[testdata2] ([Id], [VisitId], [StartDate], [EndDate]) VALUES (3450038, 1196754, CAST(N'2019-12-18T17:20:29.843' AS DateTime), CAST(N'2019-12-18T17:29:42.933' AS DateTime))
GO
SET IDENTITY_INSERT [dbo].[testdata2] OFF
GO

【问题讨论】:

    标签: sql sql-server tsql


    【解决方案1】:

    如果你想更新表,你可以使用一个简单的可更新的公用表表达式来做到这一点:

    WITH CTE AS
    (
        SELECT  [EndDate],
                ISNULL(
                    LEAD( StartDate, 1 ) 
                    OVER( PARTITION BY VisitID ORDER BY StartDate ) 
                , [EndDate]) AS NewEndDate
        FROM [dbo].[testdata2]
    )
    
    UPDATE CTE
    SET [EndDate] = [NewEndDate]
    WHERE [EndDate] <> [NewEndDate]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多