[英]MySQL select last row each day
尝试每天选择最后一行。
这是我的(简化的,实际表中有更多记录)表:
+-----+-----------------------+------+
| 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;
但是日期时间和温度不匹配。
亲切的问候
这是一种获取每天MAX
日期,然后在INNER
查询中使用它来获取其他字段的方法:
SELECT *
FROM test
WHERE `datetime` IN (
SELECT MAX(`datetime`)
FROM test
GROUP BY DATE(`datetime`)
);
这是SQL Fiddle 。
如果您的行总是插入而从未更新,并且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的讨厌的非标准扩展。 阅读此内容: https : //dev.mysql.com/doc/refman/5.7/en/group-by-handling.html
它应该正确地使用ANY_VALUE()
函数突出显示结果的不可预测性。 应该阅读....
SELECT MAX(datetime) Stamp, ANY_VALUE(temp) temp
这意味着您不能保证右行的临时值。 相反,它可以从每天分组的任何行中返回临时值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.