如何在SQL
问题描述:
计算时间,我有一个表,看起来像这样如何在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
但它不按预期工作?我该如何解决这个问题。
感谢, 俄德德罗尔
答
我不知道你怎么需要的标志看起来像,但使用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];
然后,我们需要在间隔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;
到这一点,你可以做任何你甲肾上腺素因为我们现在有多少分钟,直到每一行。例如:
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];
答
如果使用MySQL的,那么你可以尝试使用TIMEDIFF(param1, param2)
*参数1和参数可以是时间或日期时间值
+0
感谢您与我联系,问题底鞋。你的方法并没有解决这个问题。 –
Gotqn, 谢谢你的帮助,问题已经解决了。这个解决方案不会给我想要的结果。 –