【问题标题】:MySQL: Select last timestamp stored at some hour, for each day, in a range of 7 daysMySQL:选择在某个时间存储的最后一个时间戳,对于每一天,在 7 天的范围内
【发布时间】: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

标签: mysql timestamp


【解决方案1】:

这就是我想做的(而且更好,因为我还获得了每个 id_usuario 的信息),但我不确定代码效率。 注意:我在 SQL 世界中真的很新……这是在互联网上持续研究大约一周的结果!所以你可能会注意到一些硬编码......

CREATE FUNCTION somefun ()
RETURNS <SOMETHING>
BEGIN
  DECLARE eot INT DEFAULT FALSE;
  DECLARE ts_start TIMESTAMP DEFAULT NOW();
  DECLARE ts_comp TIMESTAMP DEFAULT NOW();
  DECLARE ts TIMESTAMP;
  DECLARE usr_comp MEDIUMINT DEFAULT 0;
  DECLARE usr MEDIUMINT;

  DECLARE cur CURSOR FOR SELECT * FROM Temp_Usuario ORDER BY id_usuario, ts DESC;
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET eot = TRUE;
  OPEN cur;

  leer: REPEAT
    FETCH cur INTO ts, usr, temp;
    IF usr <> usr_comp THEN
      SET usr_comp = usr;
      SET ts_comp = ts_start;
    END IF;
    IF (ts < ts_comp) AND (ts_comp > DATE_SUB(ts_start, INTERVAL 6 DAY)) THEN      

      /* DO SOMETHING */

    END IF; 
  UNTIL eot END REPEAT leer;

  CLOSE cur;
  RETURN ( <SOMETHING> );
END;
//

如果您发现改进方法或防止可能出现的错误,请告诉我...谢谢大家!

【讨论】:

    猜你喜欢
    • 2014-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多