【问题标题】:Find overlaps between timestamps in different rows in a mysql db, group by days and ID's查找 mysql 数据库中不同行中的时间戳之间的重叠,按天和 ID 分组
【发布时间】:2013-02-27 14:40:37
【问题描述】:

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

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

通过以下请求,我可以获得以下值:

sum of time, when movement took place (value in the fiddle: 421)
sum of time, when load took place (value in the fiddle: 520)
sum of time, when movement and load took place (value in the fiddle: 391)

当前版本为每一天计算这些数字,这很好用。

http://sqlfiddle.com/#!2/518dd/1

但我也会有不同的 ID。我现在想为每个 DAY 和每个 ID 计算这些数字。当我添加这些数据时,它会崩溃,请看这个小提琴:

http://sqlfiddle.com/#!2/b43fa/6

这不是这个问题的重复:Find intersections between rows and timestamps in a mysql db,因为这个问题的解决方案在这种情况下不合适/不适用。

【问题讨论】:

  • 你已经问过这个问题了。 stackoverflow.com/questions/15112004/…
  • 你为什么要创建另一个问题?
  • @BenjaminM。 . .显然,他问了另一个问题,因为第一个问题的公认答案不容易概括为按id 和日期分组。他没有否定那个问题,而是选择(在我看来是合理的)问另一个问题。

标签: mysql sql sqlite timestamp


【解决方案1】:

如 Gordon 所示,可以通过将过滤器移至最外层的SELECT 进行分组。 搜索需要附上移动事件的加载事件,方法同earlier answer

SELECT id,
       date(timestamp, 'unixepoch') AS date,
       (SUM(CASE WHEN event = 'movement end'   THEN timestamp END) -
        SUM(CASE WHEN event = 'movement start' THEN timestamp END)
       ) AS all_movement,
       (SUM(CASE WHEN event = 'load end'   THEN timestamp END) -
        SUM(CASE WHEN event = 'load start' THEN timestamp END)
       ) AS all_load,
       (SUM(CASE WHEN event = 'movement end' AND
                      (SELECT event
                       FROM Table1 b
                       WHERE timestamp = (SELECT MIN(timestamp)
                                          FROM Table1 c
                                          WHERE c.timestamp >= a.timestamp
                                            AND c.id = a.id
                                            AND c.event LIKE 'load %')
                         AND b.id = a.id
                         AND b.event LIKE 'load %'
                      ) = 'load end'
            THEN timestamp END) -
        SUM(CASE WHEN event = 'movement start' AND
                      (SELECT event
                       FROM Table1 b
                       WHERE timestamp = (SELECT MAX(timestamp)
                                          FROM Table1 c
                                          WHERE c.timestamp <= a.timestamp
                                            AND c.id = a.id
                                            AND c.event LIKE 'load %')
                         AND b.id = a.id
                         AND b.event LIKE 'load %'
                      ) = 'load start'
            THEN timestamp END)
       ) AS load_movement
FROM Table1 a
GROUP BY id,
         date(timestamp, 'unixepoch')

【讨论】:

  • 嗨,谢谢你的回答,但我无法让它在小提琴中工作,即使我用DATE(FROM_UNIXTIME(timestamp)) 替换date(timestamp, 'unixepoch')。在这里看小提琴:sqlfiddle.com/#!2/b43fa/6
  • 您的解决方案非常完美,它适用于不同的日子。但是,当另一个 ID 的条目与另一个 ID 的时间戳相同时(rowID 为 41-48 的行),它会产生错误:sqlfiddle.com/#!2/a1baa/1。在此查询中,所有其他事情都完美无缺。
  • 已更新。此外,具有相同时间戳的movement 事件可能会导致相同的问题。
【解决方案2】:

问题是您开始使用的查询。我根本不明白第三列是什么。但是,前两个更容易计算使用:

select (sum(case when event = 'movement end' then timestamp end) -
        sum(case when event = 'movement start' then timestamp end)
       ),
       (sum(case when event = 'load end' then timestamp end) -
        sum(case when event = 'load start' then timestamp end)
       )
from table1

由此,添加组应该是微不足道的:

select id, date(timestamp),
        (sum(case when event = 'movement end' then timestamp end) -
        sum(case when event = 'movement start' then timestamp end)
       ),
       (sum(case when event = 'load end' then timestamp end) -
        sum(case when event = 'load start' then timestamp end)
       )
from table1
group by id, date(timestamp)

【讨论】:

  • 第三行显示发生移动和加载的时间量......很难解释
  • @MichaelMeier 。 . .您在第一个问题上接受了一个非常糟糕的答案。它会引导你走上痛苦的道路,弄清楚你想要什么。
  • 这里是一个例子:在第 1 到第 4 行中,在 135150800 和 1351508020 的范围内没有关于负载的信息。负载信息从第 13 行的 1351508080 开始。所以“20 无负载”和“10无负载”不应用于计算“运动时间(负载)”。是否允许我重新打开另一个问题?
  • 这是这个问题的后续问题:stackoverflow.com/questions/15406149/…,谢谢。
猜你喜欢
  • 2013-02-13
  • 2015-02-12
  • 1970-01-01
  • 1970-01-01
  • 2020-07-13
  • 1970-01-01
  • 1970-01-01
  • 2013-01-24
  • 1970-01-01
相关资源
最近更新 更多