【发布时间】:2015-02-20 23:22:49
【问题描述】:
我在 MySQL 中有一个这样声明的表:
+------------+------------+------+-----+-------------------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+------------+------+-----+-------------------+-------+
| ts | timestamp | NO | | CURRENT_TIMESTAMP | |
| id_usuario | int(11) | YES | | NULL | |
| temp | float(3,1) | YES | | NULL | |
+------------+------------+------+-----+-------------------+-------+
假设这是存储在其中的数据:
+---------------------+------------+------+
| ts | id_usuario | temp |
+---------------------+------------+------+
| 2015-02-12 11:00:00 | 2 | 20.0 |
| 2015-02-15 10:00:00 | 2 | 21.0 |
| 2015-02-17 20:00:00 | 2 | 20.0 |
| 2015-02-18 11:00:00 | 1 | 23.5 |
| 2015-02-18 11:30:00 | 1 | 24.0 |
| 2015-02-19 12:00:00 | 1 | 23.5 |
| 2015-02-19 12:30:00 | 1 | 22.0 |
| 2015-02-19 15:00:00 | 1 | 23.5 |
| 2015-02-19 15:50:00 | 1 | 21.5 |
| 2015-02-20 14:00:00 | 2 | 27.0 |
| 2015-02-20 14:00:00 | 1 | 26.0 |
| 2015-02-20 21:54:33 | 2 | 22.0 |
+---------------------+------------+------+
现在...假设您在一天前的时间旅行,并且您想获得表格中的最后一个输入。然后你前一天旅行做同样的事情,等等最后 7 天......就是这样!然后想出了一张这样的桌子:(注意:我没有及时旅行!)
如果“select now()”返回'2015-02-20 13:00:00',则此过程将返回:
+---------------------+------------+------+
| ts | id_usuario | temp | <-- day 12 is out of range
+---------------------+------------+------+ but was the last input before
| 2015-02-12 11:00:00 | 2 | 20.0 | day 14 at 13hs. So its ok!
| 2015-02-15 10:00:00 | 2 | 21.0 | <-- day 17,16,15 before 13hs
| 2015-02-18 11:30:00 | 1 | 24.0 | <-- day 18 before 13hs
| 2015-02-19 12:30:00 | 1 | 22.0 | <-- day 19 before 13hs
| 2015-02-19 15:50:00 | 1 | 21.5 | <-- day 20 before 13hs
+---------------------+------------+------+
所以问题是……我该怎么做?
【问题讨论】:
-
来吧。尝试一下。
-
我想我误解了这个问题。
-
不,我理解正确。他想
GROUP BY FLOOR((UNIX_TIMESTAMP(NOW()) - UNIX_TIMESTAMP(ts))/3600),然后得到每组的最后一行。 -
查看stackoverflow.com/questions/1313120/…了解如何获取每个组的最后一行。
-
这行得通...但我认为它有点...错误...锻炼? (select * from Temp_Usuario where ts