Reputation: 193
In a table, I have data coming in from sensors. The activity value is sent by a sensor every 15 minutes. Now, I want to calculate average of these values 2 times a day. As in, the 1st average of a day will be the average of values from 00:00:00 to 12:00:00 and the 2nd average for the same day will be between the time 12:00:00 and 23:59:59.
My TimeStampByNode
column stores datetime in the format datetime2
,
i.e. "2015-09-02 02:03:04"
I used this query to get the daily average, i.e. of all 24 hours;
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
How do I modify this to get 2 daily averages?
Upvotes: 0
Views: 174
Reputation: 13858
How about doing two different averages per day? The NULL returned in ELSE cases makes sure those are not put into averages.
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
(Missing bracket edited)
Upvotes: 1
Reputation: 3743
You need to add the following condition to the GROUP BY
clause:
...
GROUP BY (...), case when (DATEPART(hh, TimeStampByNode) < 12) then 1 else 0 end
...
So this will become:
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
Upvotes: 1