I have a table that stores a sensor temperature readings every few seconds
Sample data looks like this
nId nOperationId strDeviceIp nIfIndex nValue nTimestamp 97 2 192.168.99.252 1 26502328 1593828551 158 2 192.168.99.252 1 26501704 1593828667 256 2 192.168.99.252 1 26501860 1593828788 354 2 192.168.99.250 1 26501704 1593828908 452 2 192.168.99.250 1 26501692 1593829029
I want to have the average temperature per device so I ran the following query
select strDeviceIp, AVG(CAST(nValue as bigint)) as val1 from myTable where nOperationId = 2 and nTimestamp >= 1593828600 and nTimestamp <= 1593838600 group by strSwitchIp;
Where I can pass the time range I want.
My issue is that this gives me total average but I want steps or range I want to achieve that instead of one line I’ll get all the values in a range/step of say 5 minutes as a row.
P.S. I’m trying to show a graph.
Running the following query I get
strSwitchIp average 192.168.99.252 26501731
But I would like to get
strSwitchIp average timestamp 192.168.99.252 26201731 1593828600 192.168.99.252 26532731 1593828900 192.168.99.252 24501721 1593829200 192.168.99.252 26506531 1593829500
In this example I would like to get a row every 300 seconds, per device.
Advertisement
Answer
Since your nTimestamp is number of seconds, you can simply add it to the GROUP BY. Division by 300 gives you 300 second (5 minute) intervals. In SQL Server / is integer division, which discards the fractional part.
select
strSwitchIp
,AVG(CAST(nValue as bigint)) as val1
,(nTimestamp / 300) * 300 AS Timestamp
from myTable
where
nOperationId = 2 and nTimestamp >= 1593828600 and nTimestamp <= 1593838600
group by
strSwitchIp
,nTimestamp / 300
;
nTimestamp / 300 gives an integer, a number of 5-minute intervals since 1970. / discards here the fractional part.
When this number is multiplied back by 300, it becomes again the number of seconds since 1970, but “rounded” to the nearest 5-minute interval. Just as you showed in the question in the expected result.
For example:
1593828667 / 300 = 5312762.2233333333333333333333333 discard fractional part 1593828667 / 300 = 5312762 5312762 * 300 = 1593828600
So, all timestamps between 1593828600 and 1593828899 become 1593828600 and all values for these timestamps are grouped into one row and averaged.