Home Forums SQL Server 2008 T-SQL (SS2K8) Calculate time difference between two related visitors without using cursor RE: Calculate time difference between two related visitors without using cursor

  • valeryk2000 (9/27/2016)


    This is the fragment of the table

    CREATE TABLE [dbo].[Readmission_Table](

    [ID] [float] NULL,

    [ArrivalDateTime] [datetime] NULL

    ) ON [PRIMARY]

    GO

    INSERT [dbo].[Readmission_Table] ([ID], [ArrivalDateTime]) VALUES (10000683, CAST(0x0000A66801716A50 AS DateTime))

    INSERT [dbo].[Readmission_Table] ([ID], [ArrivalDateTime]) VALUES (10000683, CAST(0x0000A66900B9AB40 AS DateTime))

    INSERT [dbo].[Readmission_Table] ([ID], [ArrivalDateTime]) VALUES (10000989, CAST(0x0000A64000B778C0 AS DateTime))

    INSERT [dbo].[Readmission_Table] ([ID], [ArrivalDateTime]) VALUES (10000989, CAST(0x0000A65101735680 AS DateTime))

    INSERT [dbo].[Readmission_Table] ([ID], [ArrivalDateTime]) VALUES (10001033, CAST(0x0000A65200F54510 AS DateTime))

    INSERT [dbo].[Readmission_Table] ([ID], [ArrivalDateTime]) VALUES (10001033, CAST(0x0000A66200B91EA0 AS DateTime))

    INSERT [dbo].[Readmission_Table] ([ID], [ArrivalDateTime]) VALUES (10001350, CAST(0x0000A64D01526100 AS DateTime))

    INSERT [dbo].[Readmission_Table] ([ID], [ArrivalDateTime]) VALUES (10001350, CAST(0x0000A66F007055D0 AS DateTime))

    INSERT [dbo].[Readmission_Table] ([ID], [ArrivalDateTime]) VALUES (10002866, CAST(0x0000A63B01305240 AS DateTime))

    INSERT [dbo].[Readmission_Table] ([ID], [ArrivalDateTime]) VALUES (10002866, CAST(0x0000A63E014D6F60 AS DateTime))

    INSERT [dbo].[Readmission_Table] ([ID], [ArrivalDateTime]) VALUES (10003932, CAST(0x0000A65800C27540 AS DateTime))

    INSERT [dbo].[Readmission_Table] ([ID], [ArrivalDateTime]) VALUES (10003932, CAST(0x0000A66201422C90 AS DateTime))

    INSERT [dbo].[Readmission_Table] ([ID], [ArrivalDateTime]) VALUES (10004218, CAST(0x0000A665013357B0 AS DateTime))

    INSERT [dbo].[Readmission_Table] ([ID], [ArrivalDateTime]) VALUES (10004218, CAST(0x0000A66A00EC34C0 AS DateTime))

    INSERT [dbo].[Readmission_Table] ([ID], [ArrivalDateTime]) VALUES (10004220, CAST(0x0000A662006D5060 AS DateTime))

    INSERT [dbo].[Readmission_Table] ([ID], [ArrivalDateTime]) VALUES (10004220, CAST(0x0000A66E0072CEA0 AS DateTime))

    INSERT [dbo].[Readmission_Table] ([ID], [ArrivalDateTime]) VALUES (10005862, CAST(0x0000A66000A06680 AS DateTime))

    INSERT [dbo].[Readmission_Table] ([ID], [ArrivalDateTime]) VALUES (10005862, CAST(0x0000A662009EC0A0 AS DateTime))

    INSERT [dbo].[Readmission_Table] ([ID], [ArrivalDateTime]) VALUES (10006299, CAST(0x0000A64000CC5880 AS DateTime))

    INSERT [dbo].[Readmission_Table] ([ID], [ArrivalDateTime]) VALUES (10006299, CAST(0x0000A645014272E0 AS DateTime))

    INSERT [dbo].[Readmission_Table] ([ID], [ArrivalDateTime]) VALUES (10007852, CAST(0x0000A64F00563E20 AS DateTime))

    INSERT [dbo].[Readmission_Table] ([ID], [ArrivalDateTime]) VALUES (10007852, CAST(0x0000A65600BE1040 AS DateTime))

    INSERT [dbo].[Readmission_Table] ([ID], [ArrivalDateTime]) VALUES (10008474, CAST(0x0000A65500163F50 AS DateTime))

    INSERT [dbo].[Readmission_Table] ([ID], [ArrivalDateTime]) VALUES (10008474, CAST(0x0000A66F00503340 AS DateTime))

    INSERT [dbo].[Readmission_Table] ([ID], [ArrivalDateTime]) VALUES (10009346, CAST(0x0000A6470130DEE0 AS DateTime))

    INSERT [dbo].[Readmission_Table] ([ID], [ArrivalDateTime]) VALUES (10009346, CAST(0x0000A64E009A5BA0 AS DateTime))

    INSERT [dbo].[Readmission_Table] ([ID], [ArrivalDateTime]) VALUES (10009346, CAST(0x0000A651017BDA30 AS DateTime))

    INSERT [dbo].[Readmission_Table] ([ID], [ArrivalDateTime]) VALUES (10009903, CAST(0x0000A64E0123AFE0 AS DateTime))

    INSERT [dbo].[Readmission_Table] ([ID], [ArrivalDateTime]) VALUES (10009903, CAST(0x0000A659015752A0 AS DateTime))

    INSERT [dbo].[Readmission_Table] ([ID], [ArrivalDateTime]) VALUES (10009903, CAST(0x0000A65A0008CA00 AS DateTime))

    INSERT [dbo].[Readmission_Table] ([ID], [ArrivalDateTime]) VALUES (10010401, CAST(0x0000A64E00549840 AS DateTime))

    INSERT [dbo].[Readmission_Table] ([ID], [ArrivalDateTime]) VALUES (10010401, CAST(0x0000A65600305700 AS DateTime))

    INSERT [dbo].[Readmission_Table] ([ID], [ArrivalDateTime]) VALUES (10011580, CAST(0x0000A63E015798F0 AS DateTime))

    INSERT [dbo].[Readmission_Table] ([ID], [ArrivalDateTime]) VALUES (10011580, CAST(0x0000A6570126B550 AS DateTime))

    INSERT [dbo].[Readmission_Table] ([ID], [ArrivalDateTime]) VALUES (10011580, CAST(0x0000A65D0105BFD0 AS DateTime))

    INSERT [dbo].[Readmission_Table] ([ID], [ArrivalDateTime]) VALUES (10012712, CAST(0x0000A64E00AB1CB0 AS DateTime))

    INSERT [dbo].[Readmission_Table] ([ID], [ArrivalDateTime]) VALUES (10012712, CAST(0x0000A65D00041EB0 AS DateTime))

    INSERT [dbo].[Readmission_Table] ([ID], [ArrivalDateTime]) VALUES (10012887, CAST(0x0000A64001586BE0 AS DateTime))

    INSERT [dbo].[Readmission_Table] ([ID], [ArrivalDateTime]) VALUES (10012887, CAST(0x0000A66901236990 AS DateTime))

    INSERT [dbo].[Readmission_Table] ([ID], [ArrivalDateTime]) VALUES (10014218, CAST(0x0000A63A00C6DA40 AS DateTime))

    INSERT [dbo].[Readmission_Table] ([ID], [ArrivalDateTime]) VALUES (10014218, CAST(0x0000A64B00B80560 AS DateTime))

    INSERT [dbo].[Readmission_Table] ([ID], [ArrivalDateTime]) VALUES (10014918, CAST(0x0000A63D01731030 AS DateTime))

    INSERT [dbo].[Readmission_Table] ([ID], [ArrivalDateTime]) VALUES (10014918, CAST(0x0000A64000C9DFB0 AS DateTime))

    INSERT [dbo].[Readmission_Table] ([ID], [ArrivalDateTime]) VALUES (10014918, CAST(0x0000A6490123F630 AS DateTime))

    INSERT [dbo].[Readmission_Table] ([ID], [ArrivalDateTime]) VALUES (10015000, CAST(0x0000A63D00CAF8F0 AS DateTime))

    INSERT [dbo].[Readmission_Table] ([ID], [ArrivalDateTime]) VALUES (10015000, CAST(0x0000A65701388FA0 AS DateTime))

    INSERT [dbo].[Readmission_Table] ([ID], [ArrivalDateTime]) VALUES (10015401, CAST(0x0000A665015BB7A0 AS DateTime))

    INSERT [dbo].[Readmission_Table] ([ID], [ArrivalDateTime]) VALUES (10015401, CAST(0x0000A669015D1730 AS DateTime))

    Since this is SQL 2008, you will need a triangular join to access the PREVIOUS/NEXT rows of data.

    WITH cteWindow AS (

    SELECT

    m.ID, m.ArrivalDateTime

    , rn = ROW_NUMBER() OVER (PARTITION BY m.ID ORDER BY m.ArrivalDateTime)

    , EndOf72HrWindow = DATEADD(HOUR, 72, m.ArrivalDateTime)

    FROM [dbo].[Readmission_Table] AS m

    )

    , cteIsInWindow AS (

    SELECT curr.ID, curr.ArrivalDateTime

    , IsInPrev72HrWindow = CASE WHEN curr.ArrivalDateTime < prv.EndOf72HrWindow THEN 1 ELSE 0 END

    , IsInNext72HrWindow = CASE WHEN curr.EndOf72HrWindow > nxt.ArrivalDateTime THEN 1 ELSE 0 END

    , PrevArrivalDateTime = prv.ArrivalDateTime

    , NextArrivalDateTime = nxt.ArrivalDateTime

    FROM cteWindow AS curr

    LEFT JOIN cteWindow AS prv

    ON curr.ID = prv.ID

    AND curr.rn = prv.rn +1

    LEFT JOIN cteWindow AS nxt

    ON curr.ID = nxt.ID

    AND curr.rn = nxt.rn -1

    )

    SELECT cte.ID, cte.ArrivalDateTime

    FROM cteIsInWindow AS cte

    WHERE IsInPrev72HrWindow = 1

    OR IsInNext72HrWindow = 1

    ORDER BY cte.ID, cte.ArrivalDateTime;