2017-10-06 17 views
1

计算时间,我有一个表,看起来像这样如何在SQL

ID    DTTM 
123456789 2017-10-05 08:00:00.000 
123456789 2017-10-05 08:05:00.000 
123456789 2017-10-05 08:07:00.000 
123456789 2017-10-05 08:15:00.000 
123456789 2017-10-05 08:25:00.000 
123456789 2017-10-05 09:00:00.000 
123456789 2017-10-05 09:01:00.000 
123456789 2017-10-05 09:02:00.000 
123456789 2017-10-05 09:03:00.000 
123456789 2017-10-05 11:00:00.000 

我需要根据时间间隔(日期没关系) 它创建一个标志为15分钟间隔,以设置标志为1 因此,在这种情况下,行1,4,6,10将被标记,并且总共将为4这个ID 每次如果interval >= 15 minutes它将重新开始,直到下一个 我试过了像这样的东西; 随着myLead AS

(
Select  top 100 percent 
      ID, 
      DTTM,     
      LEAD(DTTM,1) over (partition by ID order by DTTM) as NextDTTM 
From  Example 
Order by ID 
), myCount 
AS 
(
Select  Top 100 percent 
      ID, 
      DTTM, 
      NextDTTM, 
      DateDiff("MINUTE",DTTM,NextDTTM) as Interval 
from  myLead 
) 
Select  ID, 
      DTTM, 
      NextDTTM, 
      Interval, 
      Case When Interval >= 15 then 1 else 0 END as CountFlag 
From  myCount 
Where  Interval is not NULL 
Order by ID 

但它不按预期工作?我该如何解决这个问题。

感谢, 俄德德罗尔

回答

0

我不知道你怎么需要的标志看起来像,但使用SQL Server 2012他们是两个棘手的部分。首先,要获得下一个和前一行之间的时间差:

DECLARE @DataSource TABLE 
(
    [ID] BIGINT 
    ,[DTTM] DATETIME2 
); 

INSERT INTO @DataSource ([ID], [DTTM]) 
VALUES (123456789, '2017-10-05 08:00:00.000') 
     ,(123456789, '2017-10-05 08:05:00.000') 
     ,(123456789, '2017-10-05 08:07:00.000') 
     ,(123456789, '2017-10-05 08:15:00.000') 
     ,(123456789, '2017-10-05 08:25:00.000') 
     ,(123456789, '2017-10-05 09:00:00.000') 
     ,(123456789, '2017-10-05 09:01:00.000') 
     ,(123456789, '2017-10-05 09:02:00.000') 
     ,(123456789, '2017-10-05 09:03:00.000') 
     ,(123456789, '2017-10-05 11:00:00.000'); 

SELECT * 
     ,DATEDIFF(MINUTE,CONVERT(TIME, [DTTM]),LEAD(CONVERT(TIME, [DTTM]), 1, NULL) OVER (PARTITION BY [ID] ORDER BY [DTTM])) AS [Minutes] 
FROM @DataSource 
ORDER BY [DTTM]; 

enter image description here

然后,我们需要在间隔sum从乞讨分钟到当前行和划分他们15

WITH DataSource AS 
(
    SELECT * 
      ,DATEDIFF(MINUTE,LAG(CONVERT(TIME, [DTTM]), 1, NULL) OVER (PARTITION BY [ID] ORDER BY [DTTM]), CONVERT(TIME, [DTTM])) AS [Minutes] 
    FROM @DataSource 
) 
SELECT * 
     ,SUM(ISNULL([Minutes], 0)) OVER (PARTITION BY [ID] ORDER BY [DTTM] ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)/15 AS [MinutesRank] 
FROM DataSource; 

enter image description here

到这一点,你可以做任何你甲肾上腺素因为我们现在有多少分钟,直到每一行。例如:

WITH DataSource AS 
(
    SELECT * 
      ,DATEDIFF(MINUTE,LAG(CONVERT(TIME, [DTTM]), 1, NULL) OVER (PARTITION BY [ID] ORDER BY [DTTM]), CONVERT(TIME, [DTTM])) AS [Minutes] 
    FROM @DataSource 
) 
, DataSourceMinutesTotal AS 
(
    SELECT * 
      ,SUM(ISNULL([Minutes], 0)) OVER (PARTITION BY [ID] ORDER BY [DTTM] ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)/15 AS [MinutesRank] 
    FROM DataSource 
) 
SELECT [ID], [DTTM] 
     ,DENSE_RANK() OVER (PARTITION BY [ID] ORDER BY ISNULL([MinutesRank], 0)) AS [IntervalID] 
FROM DataSourceMinutesTotal 
ORDER BY [DTTM]; 

enter image description here

+0

Gotqn, 谢谢你的帮助,问题已经解决了。这个解决方案不会给我想要的结果。 –

0

如果使用MySQL的,那么你可以尝试使用TIMEDIFF(param1, param2) *参数1和参数可以是时间或日期时间值

+0

感谢您与我联系,问题底鞋。你的方法并没有解决这个问题。 –