2015-11-05 227 views
0

在表中,我有来自传感器的数据。活动值由传感器每15分钟发送一次。现在,我想每天计算这些值的平均值2次。同样,每天的第一个平均值将是从00:00:00到12:00:00的平均值,同一天的第二个平均值将在12:00:00和23:59之间: 59。SQL Server日期时间间隔

TimeStampByNode列存储DATETIME格式datetime2,“2015年9月2日2时03分04秒”

我使用这个查询来获取日均 即,即所有24小时;

SELECT 
    DATEFROMPARTS(YEAR(TimeStampByNode), MONTH(TimeStampByNode), DAY(TimeStampByNode)), 
    ROUND(AVG(Value), 2) 
FROM 
    data_record2 
WHERE 
    Node_ID = 55554321 AND Value_Type = 'Activity' 
GROUP BY 
    DATEFROMPARTS(YEAR(TimeStampByNode), MONTH(TimeStampByNode), DAY(TimeStampByNode)) 
ORDER BY 
    DATEFROMPARTS(YEAR(TimeStampByNode), MONTH(TimeStampByNode), DAY(TimeStampByNode)) DESC 

我该如何修改这个来获得2个日均值?

回答

1

如何每天做两个不同的平均值?在ELSE情况下返回的NULL确保那些不被放入平均值。

SELECT 
    DATEFROMPARTS(YEAR(TimeStampByNode), MONTH(TimeStampByNode), DAY(TimeStampByNode)), 
    -- Start -- 
    ROUND(AVG(CASE WHEN DATEPART(HH, TimeStampByNode) < 12 
      THEN Value ELSE NULL END), 2) as AVG_AM, 
    ROUND(AVG(CASE WHEN DATEPART(HH, TimeStampByNode) >= 12 
      THEN Value ELSE NULL END), 2) as AVG_PM 
    -- End -- 
FROM 
    data_record2 
WHERE 
    Node_ID = 55554321 AND Value_Type = 'Activity' 
GROUP BY 
    DATEFROMPARTS(YEAR(TimeStampByNode), MONTH(TimeStampByNode), DAY(TimeStampByNode)) 
ORDER BY 
    DATEFROMPARTS(YEAR(TimeStampByNode), MONTH(TimeStampByNode), DAY(TimeStampByNode)) DESC 

(编辑缺少支架)

+0

我越来越说明“AVG函数需要1个参数”的错误。 –

+0

这是错误的计算。第一个答案是返回正确的值。在案例不满意的场景中传递Null可能与此有关吗? –

+1

啊 - 第二个条件应该> = 12 – Jan

1

您需要将以下条件添加到GROUP BY条款:

... 
GROUP BY (...), case when (DATEPART(hh, TimeStampByNode) < 12) then 1 else 0 end 
... 

因此,这将成为:

SELECT 
    DATEFROMPARTS(YEAR(TimeStampByNode), MONTH(TimeStampByNode), DAY(TimeStampByNode)), 
    ROUND(AVG(Value), 2) 
FROM 
    data_record2 
WHERE 
    Node_ID = 55554321 AND Value_Type = 'Activity' 
GROUP BY 
    DATEFROMPARTS(YEAR(TimeStampByNode), MONTH(TimeStampByNode), DAY(TimeStampByNode)) 
    , case when (DATEPART(hh, TimeStampByNode) < 12) then 1 else 0 end 
ORDER BY 
      DATEFROMPARTS(YEAR(TimeStampByNode), MONTH(TimeStampByNode), DAY(TimeStampByNode)) DESC 
+0

谢谢!这工作正常。但是,我该如何区分哪一部分是哪一天? 第一个值将始终为情况1?第二个case2? –

+0

如果需要,你可以在select子句中做同样的事情:'case when(DATEPART(hh,max(TimeStampByNode))<12)then“Before 12”else“After”end'Type of Interval'' – Andy

+0

对不起,didn没有获得'间隔类型'部分! –