2017-03-22 90 views
0
Insert Into Heartbeat values 
(1 ,'3/20/2017 07:05'), 
(1 ,'3/20/2017 07:15'), 
(1 ,'3/20/2017 07:35'), 
(1 ,'3/20/2017 07:55'), 
(2 ,'3/20/2017 07:11'), 
(2 ,'3/20/2017 07:19'), 
(2 ,'3/20/2017 07:45'), 
(2 ,'3/20/2017 07:58') 

;with cte as (
     Select SensorID 
       ,MinDT  = Min(DatetimeInformation) 
       ,MaxDT  = Max(DatetimeInformation) 
     From @YourTable 
     Group By SensorID 
       ,Convert(date,DatetimeInformation) 
       ,DatePart(HOUR,DatetimeInformation) 
) 
Select SensorID 
     ,Date = Convert(date,MinDT) 
     ,TimeDuration = Format(MinDT,'htt')+ ' - ' + Format(DateAdd(HOUR,1,minDT),'htt') 
     ,DateTimeInformationList = Stuff((Select ', ' +Format(DatetimeInformation,'M/dd/yyyy h:mm') 
             From HeartBeat 
             Where SensorID=A.SensorID 
              and DatetimeInformation between A.MinDT and A.MaxDT 
             Order By DatetimeInformation 
             For XML Path ('') 
             ),1,2,'') 
from cte A 

返回在SQL Server计算最小值,最大值和平均值的时间字符串列表

Date   TimeDuration DateTimeInformationList 
1   2017-03-20 7AM - 8AM  3/20/2017 7:05, 3/20/2017 7:15, 3/20/2017 7:35, 3/20/2017 7:55 
2   2017-03-20 7AM - 8AM  3/20/2017 7:11, 3/20/2017 7:19, 3/20/2017 7:45, 3/20/2017 7:58 

我能得到帮助,以组每小时Datetimeinformation这是上面的查询。 我需要获得该TimeTime的所有DatetimeInformationList(上午7点至上午8点)的平均时间间隔(分钟或秒)

+0

当我尝试插入另一2行与(1, '3/20/2017年08:05'),(1, ''3/20/2017 08:15'),那么Sensor ID 1应该有2行,一个是7AM到8AM,另一个是上午8AM到9AM,平均值应该是分别从上午7AM到上午8AM以及上午8AM到上午9AM。但是下面的答案是选择SensorID 1的所有日期并计算平均值。它应该根据时间间隔进行计算。 – Marid

回答

0

以下是您的CTE修改,看起来可以做你正在寻找的东西。

;with cte as (
    Select h1.SensorID 
     ,MinDT  = Min(h1.DatetimeInformation) 
     ,MaxDT  = Max(h2.DatetimeInformation) 
     ,AvgInterval = Avg(datediff(second, h1.DateTimeInformation, h2.DateTimeInformation)) 
    From #HeartBeat h1 
    INNER JOIN #Heartbeat h2 
     ON h1.SensorID = h2.SensorID 
    WHERE h2.DateTimeInformation = (
     SELECT min(dateTimeInformation) 
     FROM #Heartbeat h3 
     WHERE h3.SensorID = h1.SensorID 
      AND h3.DateTimeInformation > h1.DateTimeInformation 
     ) 
    Group By h1.SensorID 
      ,Convert(date,h1.DatetimeInformation) 
      ,DatePart(HOUR,h1.DatetimeInformation) 
) 
Select A.SensorID 
    ,Date = Convert(date,MinDT) 
    ,TimeDuration = Format(MinDT,'htt')+ ' - ' + Format(DateAdd(HOUR,1,minDT),'htt') 
    ,DateTimeInformationList = Stuff((Select ', ' +Format(DatetimeInformation,'M/dd/yyyy h:mm') 
            From #HeartBeat 
            Where SensorID=A.SensorID 
             and DatetimeInformation between A.MinDT and A.MaxDT 
            Order By DatetimeInformation 
            For XML Path ('') 
           ),1,2,'') 
    ,AverageInterval = Cast(Cast(AvgInterval/60 as int) As varchar(2)) + ':' + Cast(AvgInterval % 60 AS varchar(2)) 

从CTE甲

输出:

SensorID Date TimeDuration DateTimeInformationList          AverageInterval 
1  2017-03-20 7AM - 8AM 3/20/2017 7:05, 3/20/2017 7:15, 3/20/2017 7:35, 3/20/2017 7:55 16:40 
2  2017-03-20 7AM - 8AM 3/20/2017 7:11, 3/20/2017 7:19, 3/20/2017 7:45, 3/20/2017 7:58 15:40 
+0

注意:我使用名为#Heartbeat的#temp表进行测试。 –

+0

当我尝试在(1,'3/20/2017 08:05'),(1,'3/20/2017 08:15')插入另外2行时,传感器ID 1应该有2行,一个上午7点到上午8点,上午8点到上午9点,平均值分别为上午7点到上午8点,上午8点到上午9点。但是,上面的查询正在挑选SensorID 1的所有日期并计算平均值。它应该根据时间间隔进行计算。 – Marid

相关问题