计算重复天数的持续时间为分数

问题描述 投票:1回答:3

我有以下测试数据,该数据是通过以下查询生成的:

select 
    ID,
    SequenceID,
    [Sub Status Start Date],
    [Sub Status End Date],
    DateDiff(d,[Sub Status Start Date],[Sub Status End Date]) as [Duration Days]
from SampleData

我不确定如何解决,因为在相同的开始日期和结束日期有多次出现的情况下,将持续时间计算为分数除以重复项的数量。这在屏幕快照中显示,其中ID 288有4个重复项,因此将持续时间分为4个到0.25个。对于ID 404,共有3个,因此每个ID为0.33。但是,对于ID 239,只有1,因此仍为0。

enter image description here

样本数据

CREATE TABLE [dbo].[SampleData](
    [ID] [int] NOT NULL,
    [SequenceID] [int] NOT NULL,
    [Sub Status Start Date] [datetime] NULL,
    [Sub Status End Date] [datetime] NULL
) ON [PRIMARY]

GO
INSERT [dbo].[SampleData] ([ID], [SequenceID], [Sub Status Start Date], [Sub Status End Date]) VALUES (288, 1, CAST(N'2019-08-06T00:00:00.000' AS DateTime), CAST(N'2019-08-06T00:00:00.000' AS DateTime))
GO
INSERT [dbo].[SampleData] ([ID], [SequenceID], [Sub Status Start Date], [Sub Status End Date]) VALUES (288, 2, CAST(N'2019-08-06T00:00:00.000' AS DateTime), CAST(N'2019-08-06T00:00:00.000' AS DateTime))
GO
INSERT [dbo].[SampleData] ([ID], [SequenceID], [Sub Status Start Date], [Sub Status End Date]) VALUES (288, 3, CAST(N'2019-08-06T00:00:00.000' AS DateTime), CAST(N'2019-08-06T00:00:00.000' AS DateTime))
GO
INSERT [dbo].[SampleData] ([ID], [SequenceID], [Sub Status Start Date], [Sub Status End Date]) VALUES (288, 4, CAST(N'2019-08-06T00:00:00.000' AS DateTime), CAST(N'2019-08-06T00:00:00.000' AS DateTime))
GO
INSERT [dbo].[SampleData] ([ID], [SequenceID], [Sub Status Start Date], [Sub Status End Date]) VALUES (288, 5, CAST(N'2019-08-06T00:00:00.000' AS DateTime), CAST(N'2019-08-13T00:00:00.000' AS DateTime))
GO
INSERT [dbo].[SampleData] ([ID], [SequenceID], [Sub Status Start Date], [Sub Status End Date]) VALUES (288, 6, CAST(N'2019-08-09T00:00:00.000' AS DateTime), CAST(N'2019-08-09T00:00:00.000' AS DateTime))
GO
INSERT [dbo].[SampleData] ([ID], [SequenceID], [Sub Status Start Date], [Sub Status End Date]) VALUES (288, 7, CAST(N'2019-08-13T00:00:00.000' AS DateTime), CAST(N'2019-10-03T00:00:00.000' AS DateTime))
GO
INSERT [dbo].[SampleData] ([ID], [SequenceID], [Sub Status Start Date], [Sub Status End Date]) VALUES (288, 8, CAST(N'2019-10-03T00:00:00.000' AS DateTime), CAST(N'2019-10-03T00:00:00.000' AS DateTime))
GO
INSERT [dbo].[SampleData] ([ID], [SequenceID], [Sub Status Start Date], [Sub Status End Date]) VALUES (404, 1, CAST(N'2019-11-02T00:00:00.000' AS DateTime), CAST(N'2019-11-03T00:00:00.000' AS DateTime))
GO
INSERT [dbo].[SampleData] ([ID], [SequenceID], [Sub Status Start Date], [Sub Status End Date]) VALUES (404, 2, CAST(N'2019-11-28T00:00:00.000' AS DateTime), CAST(N'2019-11-28T00:00:00.000' AS DateTime))
GO
INSERT [dbo].[SampleData] ([ID], [SequenceID], [Sub Status Start Date], [Sub Status End Date]) VALUES (404, 3, CAST(N'2019-11-28T00:00:00.000' AS DateTime), CAST(N'2019-11-28T00:00:00.000' AS DateTime))
GO
INSERT [dbo].[SampleData] ([ID], [SequenceID], [Sub Status Start Date], [Sub Status End Date]) VALUES (404, 4, CAST(N'2019-11-28T00:00:00.000' AS DateTime), CAST(N'2019-11-28T00:00:00.000' AS DateTime))
GO
INSERT [dbo].[SampleData] ([ID], [SequenceID], [Sub Status Start Date], [Sub Status End Date]) VALUES (404, 5, CAST(N'2019-11-28T00:00:00.000' AS DateTime), CAST(N'2019-11-29T00:00:00.000' AS DateTime))
GO
INSERT [dbo].[SampleData] ([ID], [SequenceID], [Sub Status Start Date], [Sub Status End Date]) VALUES (404, 6, CAST(N'2019-11-29T00:00:00.000' AS DateTime), NULL)
GO
INSERT [dbo].[SampleData] ([ID], [SequenceID], [Sub Status Start Date], [Sub Status End Date]) VALUES (239, 1, CAST(N'2019-06-25T00:00:00.000' AS DateTime), CAST(N'2019-06-25T00:00:00.000' AS DateTime))
GO
INSERT [dbo].[SampleData] ([ID], [SequenceID], [Sub Status Start Date], [Sub Status End Date]) VALUES (239, 2, CAST(N'2019-06-25T00:00:00.000' AS DateTime), CAST(N'2019-06-26T00:00:00.000' AS DateTime))
GO
INSERT [dbo].[SampleData] ([ID], [SequenceID], [Sub Status Start Date], [Sub Status End Date]) VALUES (239, 3, CAST(N'2019-06-26T00:00:00.000' AS DateTime), CAST(N'2019-06-28T00:00:00.000' AS DateTime))
GO
INSERT [dbo].[SampleData] ([ID], [SequenceID], [Sub Status Start Date], [Sub Status End Date]) VALUES (239, 4, CAST(N'2019-06-28T00:00:00.000' AS DateTime), CAST(N'2019-08-04T00:00:00.000' AS DateTime))
GO
INSERT [dbo].[SampleData] ([ID], [SequenceID], [Sub Status Start Date], [Sub Status End Date]) VALUES (239, 5, CAST(N'2019-07-01T00:00:00.000' AS DateTime), CAST(N'2019-08-04T00:00:00.000' AS DateTime))
GO
sql sql-server tsql
3个回答
1
投票

尝试一下


0
投票

尝试此答案。


0
投票

请尝试这个。。>

SELECT s.ID
    ,SequenceID
    ,[Sub Status Start Date]
    ,[Sub Status End Date]
    ,DATEDIFF(DAY, [Sub Status Start Date], [Sub Status End Date]) Duration
    ,CAST(CASE 
            WHEN DATEDIFF(DAY, [Sub Status Start Date], [Sub Status End Date]) > 0
                THEN DATEDIFF(DAY, [Sub Status Start Date], [Sub Status End Date])
            ELSE CASE 
                    WHEN c.NumCount = 1
                        THEN 0
                    ELSE 1.0 / c.NumCount
                    END
            END AS NUMERIC(8, 2)) AS Result
FROM SampleData s
LEFT JOIN (
    SELECT [ID]
        ,[Sub Status End Date] Dated
        ,COUNT(1) NumCount
    FROM SampleData
    WHERE [Sub Status Start Date] = [Sub Status End Date]
    GROUP BY [ID]
        ,[Sub Status End Date]
    ) c ON c.ID = s.ID
    AND s.[Sub Status End Date] = c.Dated
    AND DATEDIFF(DAY, [Sub Status Start Date], [Sub Status End Date]) = 0
© www.soinside.com 2019 - 2024. All rights reserved.