按每分钟的最佳值进行搜索



我遇到的问题是,我有一个数据表,它每秒都会添加一个新行(想象一下结构{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在评论中提到,您可以使用DATEDIFFDATEADD按分钟进行分区。然后使用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(,[日期精简至分钟]。

这是一种简单的方法,当你问这个问题时,我想你想要一个易于理解的解决方案。

最新更新