【问题标题】:MySQL sampling data by datetime fieldMySQL按日期时间字段采样数据
【发布时间】:2018-04-10 12:29:30
【问题描述】:

我有一个如下结构的 MySQL 表:

ID     | data           | Timestamp          | secondary_key |         
--------------------------------------------------------------
|1     | blahblah       |2018-09-03 10:45:27 | value1        |
--------------------------------------------------------------
|2     | someotherblah  |2018-09-08 10:46:56 | value2        |
--------------------------------------------------------------
|3     | blahblahagain  |2018-09-03 10:17:02 | value1        |
--------------------------------------------------------------
|4     | someotherblah  |2018-09-03 10:52:02 | value1        |
--------------------------------------------------------------

并且我需要通过在 Timestamp 字段上每 30 分钟对它们进行采样来选择具有给定值的记录,即从上面的数据中:如果现在是 10:53 并且辅助键 = value1,我想要我的查询仅返回 ID = 4 和 3 的记录)。 我怎样才能做到这一点?

我希望我的问题能被理解,对不起我的英语不好。

编辑:如果查询是在 2018-09-03 10:53 执行的,这是预期的输出

|ID    | data           | Timestamp          | secondary_key |         
--------------------------------------------------------------
|4     | someotherblah  |2018-09-03 10:52:02 | value1        |
--------------------------------------------------------------
|3     | blahblahagain  |2018-09-03 10:17:02 | value1        |
--------------------------------------------------------------

【问题讨论】:

  • 还提供预期输出为 ascii 数据表..
  • 如果查询是在 2018-09-03 10:53:27 执行的,这是预期的输出。身份证 |数据 |时间戳 |次要键 | -------------------------------------------------- ---------------------------------- |4 | someotherblah |2018-09-03 10:52:02 |值1 | -------------------------------------------------- ---------------------------------- |3 |废话|2018-09-03 10:17:02 |值1 | -------------------------------------------------- ----------------------------------
  • 使用帖子下方的编辑按钮,不要将 SQL 代码放入评论部分。
  • 已编辑,抱歉。

标签: mysql datetime time sample


【解决方案1】:

您可以在 30 分钟之前对子选择组使用联接

select * from my_table 
inner join ( 
  SELECT  min(Timestamp) min_time, secondary_key
  from my_table 
  where secondary_key = 'value1'
  GROUP BY ROUND(UNIX_TIMESTAMP(timestamp)/(30* 60)), secondary_key
  ) t on  my_table.Timestamp = t.min_time and t.secondary_key = my_table.secondary_key;

【讨论】:

  • 内部查询看起来无法生存 sql_mode only_full_group_by
  • @RaymondNijland .. 感谢在 group by 中添加缺少的列 .. 再次感谢
  • @RaymondNijland 感谢您的所有报告 .. 我会从您的一些有效答案中为您投票
猜你喜欢
  • 1970-01-01
  • 2017-12-12
  • 1970-01-01
  • 1970-01-01
  • 2020-12-12
  • 2021-09-02
  • 2012-06-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多