按每分钟的最佳值搜索
Posted
技术标签:
【中文标题】按每分钟的最佳值搜索【英文标题】:Search by best values for every minute 【发布时间】:2021-11-17 10:00:22 【问题描述】:我遇到的问题是我有一个数据表,其中每秒添加一个新行(想象一下结构 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
【问题讨论】:
SELECT MAX(value), datetime FROM table GROUP BY DATEPART 这样的事情?但是我不知道日期部分是否可能是分钟。但我敢肯定,如果您搜索“按分钟分组”,您会找到一些东西。请记住,尽管这只会为您提供每分钟的最高价值。 “最好”是什么意思?以及输出如何变成4
? 2015-01-01 00:01:00
分钟发生了什么?
@Charlieface 抱歉,必须编辑我的帖子以澄清这个想法:最好参考最高值 asc,4 是与最高值相关的对象数,在本例中为 129 和 128。
使用row_number
和value
进行排序,DateDiff
进行分区。选择 row_number
【参考方案1】:
正如@ZoharPeled in the comments 所说,您可以使用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<>fiddle
【讨论】:
【参考方案2】:一种简单的方法是将日期缩减为分钟,然后将其粘贴到临时表中,然后从 temptable 组中选择 max(value), [date stripped down to the minute] by [date stripped down to分钟]。
这是一种简单的方法,当你问这个问题时,我假设你想要一个易于理解的解决方案。
【讨论】:
以上是关于按每分钟的最佳值搜索的主要内容,如果未能解决你的问题,请参考以下文章
Elasticsearch教程 Elasticsearch查询语法 Elasticsearch权威指南 深入理解Elasticsearch