【问题标题】:Find intersections between rows and timestamps in a mysql db在 mysql 数据库中查找行和时间戳之间的交集
【发布时间】:2013-02-13 06:07:08
【问题描述】:

我有一张表,其中列出了某些对象的事件。

有两个事件:“移动”和“加载”。它们可以开始和结束,并且这些事件会在它们发生时用时间戳列出。

现在我要计算以下三个数字:

  • 发生移动的时间总和(小提琴中的值:700)
  • 加载发生的时间总和(小提琴中的值:630)
  • 发生移动和加载的时间总和(小提琴中的值:611)

我在这里为这个问题创建了一个 sqlfiddle:

http://sqlfiddle.com/#!2/be512

【问题讨论】:

  • +1 用于设置要使用的模式,但我相信人们会要求先看看你的 go ;-)
  • 也许有可能自己加入表格然后计算这个数字......但我无法完成。
  • 如果您可以粘贴您尝试过的内容,人们会建议您如何修改它。
  • 你能解释一下你是如何确定你的小提琴中的移动事件是“加载”还是“无加载”的。我大约是half way there,但不太清楚第一位的逻辑。此外,第 18 行和第 19 行之间的差异似乎是 20,这是一个错误还是我遗漏了什么?
  • 另外,您只想要有效时间吗?我的意思是,在你的小提琴中,你是在结束事件之后但在下一个开始事件之前计算时间,作为总数的一部分。例如,在第 17 行中,您将 10 秒计入总时间,即使这是从一个加载事件结束到下一个加载事件开始的时间。

标签: mysql sql sqlite postgresql timestamp


【解决方案1】:

试试这个

对于负载答案将是 630 而不是 690

对于第一种和第二种情况

SELect max(timestamp) - min(timestamp), LEFT(event, LOCATE(' ', event)) 
FROM table1 
group by id, LEFT(event, LOCATE(' ', event));

第三种情况

SELect max(timestamp) - min(timestamp), id
FROM table1 
group by id;

FIDDLE

【讨论】:

  • 630 和 700 是正确的,但 710 不是正确的数字...应该是 611?
  • 您的起始值为1351508000,结束值为1351508710,它返回710:P
  • 不是 690 而是 630 用于加载正确的问题。
【解决方案2】:

前两列计算对应的end/start 事件之间的差异。 (求和是可交换的,所以我们不需要实际匹配对应的事件。)

第三列搜索前面load事件是load start事件的movement start事件,以及后面load事件是load end事件的movement end事件。

SELECT (SELECT SUM(timestamp)
        FROM Table1
        WHERE event = 'movement end') -
       (SELECT SUM(timestamp)
        FROM Table1
        WHERE event = 'movement start') AS all_movement,

       (SELECT SUM(timestamp)
        FROM Table1
        WHERE event = 'load end') -
       (SELECT SUM(timestamp)
        FROM Table1
        WHERE event = 'load start') AS all_load,

       (SELECT SUM(timestamp)
        FROM Table1 a
        WHERE event = 'movement end' AND
              (SELECT event
               FROM Table1 b
               WHERE timestamp = (SELECT min(timestamp)
                                  FROM Table1 c
                                  WHERE c.timestamp >= a.timestamp
                                    AND c.event LIKE 'load %')
              ) = 'load end') -
       (SELECT SUM(timestamp)
        FROM Table1 a
        WHERE event = 'movement start' AND
              (SELECT event
               FROM Table1 b
               WHERE timestamp = (SELECT max(timestamp)
                                  FROM Table1 c
                                  WHERE c.timestamp <= a.timestamp
                                    AND c.event LIKE 'load %')
              ) = 'load start') AS load_movement;

【讨论】:

  • 我寻找我在开头提到的三个值:700,690,611
  • 阅读 GarethL 的评论。我的查询计算end 和以下start 事件之间的时间。
  • 最后一个问题:是否可以根据所有 ID 和天数计算此值?
  • 这是一个新问题。然后你应该指定这是什么类型的时间戳。
  • 好的 ;),在这里完成了:stackoverflow.com/questions/15114811/…
【解决方案3】:

这是获取开始和结束之间时间的查询:

select sum(a.timestamp-b.timestamp) from Table1 a join Table1 b on a.rowid-b.rowid=1 and a.rowid%2=0 and a.event='movement end';

类似,在结束和开始之间:

select sum(a.timestamp-b.timestamp) from Table1 a join Table1 b on a.rowid-b.rowid=1 and a.rowid%2=1 and a.event='movement start';

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-23
    • 2020-11-06
    • 2011-04-20
    相关资源
    最近更新 更多