【问题标题】:Using MySQL : Compare values in two consecutive records in a table using a timestamp field使用 MySQL:使用时间戳字段比较表中两个连续记录中的值
【发布时间】:2013-01-08 08:45:47
【问题描述】:

我有一张桌子 表格数据

(startTime, endTime, data)

例如,

startTime               |            endTime             |        data  
2000-01-01 03:00:00     |    2000-01-01 03:00:10         |         88   
2000-01-01 03:00:10     |    2000-01-01 03:00:20         |         33  
2000-01-01 03:00:30     |    2000-01-01 03:00:40         |         67  ......and so on

我希望在没有数据时将条目(2000-01-01 03:00:20,2000-01-01 03:00:30,0)插入数据中,因此为 0。输出将是:-

 startTime              |           endTime                 |       data  
2000-01-01 03:00:00     |    2000-01-01 03:00:10            |      88   
2000-01-01 03:00:10     |    2000-01-01 03:00:20            |      33    
**2000-01-01 03:00:20   |    2000-01-01 03:00:30            |       0**  
2000-01-01 03:00:30     |    2000-01-01 03:00:40            |      67  .....  and so on

最简单的方法是什么。
请我今天必须完成,否则我的老板会杀了我。 多谢你们。

有没有办法检查上一行的endTime是否等于当前行的startTime并相应地插入到表中?

更多信息:-

这是我现在使用的存储过程,用于从 inputTable 中累积并以 10 秒的间隔将其存储到输出表中。 http://sqlfiddle.com/#!2/838de/1

【问题讨论】:

  • 我是数据库新手,所以我尝试在存储过程中创建游标失败,但我似乎无法返回上一行进行比较
  • 但是有成千上万个条目并且没有 id,条目会在需要时动态出现
  • 您将此作为示例数据,但在您的实际表格中是否总是 10 秒间隔?

标签: mysql stored-procedures cursor timestamp compare


【解决方案1】:

只需插入记录并在其中创建一个视图

SELECT * FROM tableData ORDER BY startTime ASC, endTime ASC;

【讨论】:

  • 不就是 tableData ( startTime timestamp, endTime timestamp, data int) ,我想如果需要我可以添加一个自动递增的主键
  • 没有简单的方法。一个虚拟测试是添加列 preferred_Order 并使用触发器来更新值。
  • 虚拟测试将添加列 preferred_Order 并使用触发器更新值。为什么不直接使用 ORDER BY 子句?即你为什么对物理行顺序感兴趣?
  • sqlfiddle.com/#!2/43365/1 - 测试数据(只是因为我喜欢使用真实数据)
  • 感谢 Anda,我需要证明该时间间隔内有 0 个数据,以便团队在稍后阶段进行分析。所以我被要求添加物理行。
【解决方案2】:

这是一个例子。

我假设每条新记录都大于或等于表中最大的endTime,并且每条记录前进 10 秒。我还假设您永远不会在一次调用中插入多行。

否则,您仍需要提供有关您希望如何处理可能性的更多信息。

-- DROP PROCEDURE IF EXISTS addRecord;
DELIMITER //
CREATE PROCEDURE addRecord(startT TIMESTAMP, endT TIMESTAMP, rowData INT)
BEGIN
    DECLARE lastEndTime TIMESTAMP;
    SET lastEndTime = (SELECT MAX(`endTime`) FROM tableData);
    WHILE lastEndTime < startT DO
        INSERT INTO tableData (`startTime`,`endTime`,`data`)
        VALUES (lastEndTime,DATE_ADD(lastEndTime, INTERVAL 10 SECOND),0);
        SET lastEndTime = DATE_ADD(lastEndTime, INTERVAL 10 SECOND);
    END WHILE;
    INSERT INTO `tableData` (`startTime`,`endTime`,`data`)
    VALUES (startT,endT,rowData);
END //

要这样称呼……

CALL addRecord('2000-01-01 03:00:50','2000-01-01 03:01:00',23);

【讨论】:

  • 嘿inhan,谢谢你的建议!但我似乎无法弄清楚如何一次将数据输入到输出表中。我在编辑的问题中添加了我正在使用的存储过程。再次感谢。
猜你喜欢
  • 1970-01-01
  • 2015-08-18
  • 2012-06-03
  • 1970-01-01
  • 2018-06-14
  • 1970-01-01
  • 2010-11-06
  • 2017-04-22
  • 2023-03-30
相关资源
最近更新 更多