MySQL每天选择最后一行

时间:2017-06-05 18:23:18

标签: mysql aggregate-functions

尝试每天选择最后一行。

这是我的(简化的,实际表中的更多记录)表:

+-----+-----------------------+------+
| id  |       datetime        | temp |
+-----+-----------------------+------+
|  9  | 2017-06-05 23:55:00   | 9.5  |
|  8  | 2017-06-05 23:50:00   | 9.6  |
|  7  | 2017-06-05 23:45:00   | 9.3  |
|  6  | 2017-06-04 23:55:00   | 9.4  |
|  5  | 2017-06-04 23:50:00   | 9.2  |
|  4  | 2017-06-05 23:45:00   | 9.1  |
|  3  | 2017-06-03 23:55:00   | 9.8  |
|  2  | 2017-06-03 23:50:00   | 9.7  |
|  1  | 2017-06-03 23:45:00   | 9.6  |
+-----+-----------------------+------+

我想选择id = 9,id = 6和id = 3的行。

我试过这个问题:

SELECT MAX(datetime) Stamp
     , temp 
  FROM weatherdata 
 GROUP 
    BY YEAR(DateTime)
     , MONTH(DateTime)
     , DAY(DateTime) 
 order 
    by datetime desc 
 limit 10;

但是datetime和temp不匹配。

亲切的问候

2 个答案:

答案 0 :(得分:2)

这是一种方法,每天获取string日期,然后在MAX查询中使用它来获取其他字段:

INNER

这是 SQL Fiddle

答案 1 :(得分:0)

如果您的行始终是插入且永不更新,并且id是自动增量主键,那么

SELECT w.*
  FROM weatherdata w
  JOIN (   SELECT MAX(id) id
             FROM weatherdata
            GROUP BY DATE(datetime)
       ) last ON w.id = last.id

会得到你想要的东西。为什么?内部查询返回id中每个日期的最大值(表示最近的)weatherdata值。这确实非常快,特别是如果您在datetime列上添加索引。

但是,这项工作的条件可能不会成功。如果您的datetime列有时会更新以更改日期,那么较大的id值可能并不总是意味着更大的datetime值。

在这种情况下,你需要这样的东西。

SELECT w.*
  FROM weatherdata w
  JOIN (   SELECT MAX(datetime) datetime
             FROM weatherdata
            GROUP BY DATE(datetime)
       ) last ON w.datetime = last.datetime

您的查询不起作用,因为它滥用了对MySQL GROUP BY的令人讨厌的非标准扩展。阅读:https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html

应该正确地使用the ANY_VALUE() function来强调结果的不可预测性。它应该阅读....

SELECT MAX(datetime) Stamp, ANY_VALUE(temp) temp

这意味着您无法保证正确的行的临时值。相反,它可以从每天的分组中的任何行返回临时值。