按每分钟的最佳值搜索

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 这样的事情?但是我不知道日期部分是否可能是分钟。但我敢肯定,如果您搜索“按分钟分组”,您会找到一些东西。请记住,尽管这只会为您提供每分钟的最高价值。 “最好”是什么意思?以及输出如何变成42015-01-01 00:01:00 分钟发生了什么? @Charlieface 抱歉,必须编辑我的帖子以澄清这个想法:最好参考最高值 asc,4 是与最高值相关的对象数,在本例中为 129 和 128。 使用row_numbervalue 进行排序,DateDiff 进行分区。选择 row_number 【参考方案1】:

正如@ZoharPeled in the comments 所说,您可以使用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<>fiddle

【讨论】:

【参考方案2】:

一种简单的方法是将日期缩减为分钟,然后将其粘贴到临时表中,然后从 temptable 组中选择 max(value), [date stripped down to the minute] by [date stripped down to分钟]。

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

【讨论】:

以上是关于按每分钟的最佳值搜索的主要内容,如果未能解决你的问题,请参考以下文章

搜索比较前缀的最佳匹配

Elasticsearch教程 Elasticsearch查询语法 Elasticsearch权威指南 深入理解Elasticsearch

使用选项编码 PHP/MYSQL 搜索的最佳方法 [关闭]

贪婪的最佳优先搜索算法与最佳优先搜索算法有啥不同?

pytorch深度学习模型调参策略:采用贝叶斯工具进行最优参数搜索及最佳步数确认

使用网格搜索的交叉验证返回的结果比默认值差