MySQL每天选择最后一行

MySQL每天选择最后一行,mysql,aggregate-functions,Mysql,Aggregate Functions,正在尝试每天选择最后一行 这是我的(简化,实际表中有更多记录)表: 我想选择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; 但是dateti

正在尝试每天选择最后一行

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

我想选择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不匹配


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

SELECT * 
FROM test
WHERE `datetime` IN (
  SELECT MAX(`datetime`) 
  FROM test
  GROUP BY DATE(`datetime`)
 );

以下是

如果您的行总是插入且从不更新,并且
id
是一个自动递增的主键,那么

SELECT w.*
  FROM weatherdata w
  JOIN (   SELECT MAX(id) id
             FROM weatherdata
            GROUP BY DATE(datetime)
       ) last ON w.id = last.id
你会得到你想要的。为什么?内部查询返回
weatherdata
中每个日期的最大(表示最近的)
id
值。这确实非常快,特别是如果您在
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的讨厌的非标准扩展。请阅读以下内容:

它应该恰当地用来强调结果的不可预测性。应该是

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

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

你能详细说明一下吗:但是日期时间和温度不匹配。达尔山·梅塔:太好了!只是我想要的。琼斯:id是自动递增的,行永远不会更新。谢谢你的建议。id是自动递增的,并且从不更新行。Darshan的建议奏效了,但我也从你那里学到了一些东西。我喜欢你告诉我这个查询在做什么。我也尝试了你的建议(第一个),这也很好。谢谢
SELECT MAX(datetime) Stamp, ANY_VALUE(temp) temp