我遇到的问题是,我有一个数据表,它每秒都会添加一个新行(想象一下结构{id,timestamp(datetime(,value}(。我想对MSSQL进行一次查询,以遍历该表,并仅输出每分钟具有前2个值asc的对象数(也输出(。
有什么想法吗?
样本数据:
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
@ZoharPeled在评论中提到,您可以使用DATEDIFF
和DATEADD
按分钟进行分区。然后使用DENSE_RANK
获取前两个value
结果。
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;
db<gt;小提琴
一个简单的方法是将日期缩减为分钟,然后将其粘贴在临时表中,然后通过[日期精简为分钟]从临时表组中选择max(value(,[日期精简至分钟]。
这是一种简单的方法,当你问这个问题时,我想你想要一个易于理解的解决方案。