The problem I’m having is that I have a table of data that has a new row added every second (imagine the structure {id, timestamp(datetime), value}). I would like to do a single query for MSSQL to go through the table and output only the number of objects that have the top 2 values asc for each minute ( also output ).
Any ideas please?
Sample data:
1 2015-01-01 00:00:00 128 2 2015-01-01 00:00:01 128 3 2015-01-01 00:00:04 129 4 2015-01-01 00:00:05 123 ... 67 2015-01-01 00:00:59 128 Output : starttime endtime number 2015-01-01 00:00:00 2015-01-01 00:00:59 4
Advertisement
Answer
As mentioned by @ZoharPeled in the comments, you can use DATEDIFF and DATEADD to partition by minute. Then use DENSE_RANK to take the top two value results.
SELECT
t.StartTime,
EndTime = DATEADD(second, 59, t.StartTime),
number = COUNT(*)
FROM (
SELECT *,
rn = DENSE_RANK() OVER (PARTITION BY v.StartTime ORDER BY t.value DESC)
FROM YourTable t
CROSS APPLY (VALUES (
DATEADD(minute, DATEDIFF(minute, '20000101', t.timestamp), '20000101')
)) v(StartTime)
) t
WHERE rn <= 2
GROUP BY
t.StartTime;