Mysql 从显示的表格和日期格式中选择最小元素的最有效查询

Mysql 从显示的表格和日期格式中选择最小元素的最有效查询,mysql,join,greatest-n-per-group,min,date-format,Mysql,Join,Greatest N Per Group,Min,Date Format,我有一个包含一百万行的表,我想得到包含min date和按天格式化的行 我的桌子是: Id Created_at Value 1 2019-04-08 10:35:32 254 1 2019-04-08 10:31:23 241 1 2019-04-08 11:47:32 258 2 2019-04-08 10:32:42 276 2 2019-04-08 10:34:23 280 2 2019-04-08 11:34:23 290 我想得到(每小时

我有一个包含一百万行的表,我想得到包含min date和按天格式化的行

我的桌子是:

Id  Created_at          Value
1   2019-04-08 10:35:32 254
1   2019-04-08 10:31:23 241
1   2019-04-08 11:47:32 258
2   2019-04-08 10:32:42 276
2   2019-04-08 10:34:23 280
2   2019-04-08 11:34:23 290
我想得到(每小时的最小创建值和每小时的格式):

我有mysql 5.7,因此无法构建窗口查询。我正在研究选择这些元素的最有效方法。

在mysql 5.7中

可以对子查询使用联接以获得最小结果

select  m.id, date(m.created_at) , m.value
INNER JOIN (
select  min(created_at) min_date
from  my_tbale  
group by date(created_at),hour(created_at)

) t on t.min_date  = m.created_at
确保在mysql 5.7中的my_表列(创建于、id、值)上有一个复合索引

可以对子查询使用联接以获得最小结果

select  m.id, date(m.created_at) , m.value
INNER JOIN (
select  min(created_at) min_date
from  my_tbale  
group by date(created_at),hour(created_at)

) t on t.min_date  = m.created_at

确保在my_表列上有一个复合索引(创建时间、id、值)

我将执行以下操作:

select
  t.id, m.h, t.value
from my_table t
join (
  select
    id,
    from_unixtime(floor(unix_timestamp(created_at) / 3600) * 3600) as h,
    min(created_at) as min_created_at
  from my_table
  group by id, from_unixtime(floor(unix_timestamp(created_at) / 3600) * 3600)
) m on m.id = t.id and m.min_created_at = t.created_at

我会这样做:

select
  t.id, m.h, t.value
from my_table t
join (
  select
    id,
    from_unixtime(floor(unix_timestamp(created_at) / 3600) * 3600) as h,
    min(created_at) as min_created_at
  from my_table
  group by id, from_unixtime(floor(unix_timestamp(created_at) / 3600) * 3600)
) m on m.id = t.id and m.min_created_at = t.created_at

为什么要
258
?这不是最小值。Ops,我要每个小时的最新值为什么要
258
?这不是最小值。Ops,我要每个小时的最新值