用于确定最大并发事件数的MySQL公式

用于确定最大并发事件数的MySQL公式,mysql,Mysql,我正试图想出一种方法,在MySQL表中获取两个字段条目,一个是时间戳,例如“2013-07-31 11:59:46”,另一个是以秒为单位的持续时间,例如“55”,并找到所有相互重叠的记录,以及在这段时间内有多少记录重叠。我已经头疼了,但我肯定能治好吗?获取返回值的好方法是什么 例如,假设我从1月1日开始总共有5个条目 2013-01-01 09:00:00 | 30 (an event that started at 9:00am and lasted 30 seconds) 2013-

我正试图想出一种方法,在MySQL表中获取两个字段条目,一个是时间戳,例如“2013-07-31 11:59:46”,另一个是以秒为单位的持续时间,例如“55”,并找到所有相互重叠的记录,以及在这段时间内有多少记录重叠。我已经头疼了,但我肯定能治好吗?获取返回值的好方法是什么

例如,假设我从1月1日开始总共有5个条目

2013-01-01 09:00:00 | 30     (an event that started at 9:00am and lasted 30 seconds)
2013-01-01 09:02:00 | 360    (an event that started at 9:02am and lasted 6 minutes)
2013-01-01 09:03:00 | 600    (an event that started at 9:03am and lasted 10 minutes)
2013-01-01 09:11:00 | 10    (an event that started at 9:11am and lasted 10 seconds)
2013-01-01 09:12:00 | 30    (an event that started at 9:12am and lasted 30 seconds)

针对这些条目运行时,我会得到一个返回值2,因为这是并发事件的最大数量。事件2和3重叠。然后,事件2在事件3和4开始之前结束,这两个事件依次重叠。这不会改变我们的返回值,因为在任何给定的时间只有两个并发事件。

考虑以下几点

 DROP TABLE IF EXISTS my_table;

 CREATE TABLE my_table
 (id INT NOT NULL AUTO_INCREMENT PRIMARY KEY
 ,dt DATETIME NOT NULL
 ,duration INT NOT NULL
 );

 INSERT INTO my_table (dt,duration) VALUES
 ('2013-01-01 09:00:00',30),
 ('2013-01-01 09:02:00',360),
 ('2013-01-01 09:03:00',600),
 ('2013-01-01 09:11:00',10),
 ('2013-01-01 09:12:00',30);


  SELECT *
    FROM my_table x
    JOIN my_table y
      ON y.id <> x.id
     AND y.dt < (x.dt + INTERVAL x.duration SECOND)
     AND (y.dt + INTERVAL y.duration SECOND) > x.dt;
 +----+---------------------+----------+----+---------------------+----------+
 | id | dt                  | duration | id | dt                  | duration |
 +----+---------------------+----------+----+---------------------+----------+
 |  3 | 2013-01-01 09:03:00 |      600 |  2 | 2013-01-01 09:02:00 |      360 |
 |  2 | 2013-01-01 09:02:00 |      360 |  3 | 2013-01-01 09:03:00 |      600 |
 |  4 | 2013-01-01 09:11:00 |       10 |  3 | 2013-01-01 09:03:00 |      600 |
 |  5 | 2013-01-01 09:12:00 |       30 |  3 | 2013-01-01 09:03:00 |      600 |
 |  3 | 2013-01-01 09:03:00 |      600 |  4 | 2013-01-01 09:11:00 |       10 |
 |  3 | 2013-01-01 09:03:00 |      600 |  5 | 2013-01-01 09:12:00 |       30 |
 +----+---------------------+----------+----+---------------------+----------+

 or, if you prefer...

  SELECT *
    FROM my_table x
    JOIN my_table y
      ON y.id < x.id
     AND y.dt < (x.dt + INTERVAL x.duration SECOND)
     AND (y.dt + INTERVAL y.duration SECOND) > x.dt;
 +----+---------------------+----------+----+---------------------+----------+
 | id | dt                  | duration | id | dt                  | duration |
 +----+---------------------+----------+----+---------------------+----------+
 |  3 | 2013-01-01 09:03:00 |      600 |  2 | 2013-01-01 09:02:00 |      360 |
 |  4 | 2013-01-01 09:11:00 |       10 |  3 | 2013-01-01 09:03:00 |      600 |
 |  5 | 2013-01-01 09:12:00 |       30 |  3 | 2013-01-01 09:03:00 |      600 |
 +----+---------------------+----------+----+---------------------+----------+
如果你愿意,我们可以这样说:

nothing overlaps item 1
1 thing overlaps item 2 (item 3), 
3 things overlap item 3 (items 2, 4, & 5), and
1 thing (item 3) overlaps each of items 4 & 5!


 SELECT x.id
      , COUNT(y.id) overlaps
    FROM my_table x
    LEFT
    JOIN my_table y
      ON y.id <> x.id
     AND y.dt < (x.dt + INTERVAL x.duration SECOND)
     AND (y.dt + INTERVAL y.duration SECOND) > x.dt
   GROUP
      By x.id;

 +----+----------+
 | id | overlaps |
 +----+----------+
 |  1 |        0 |
 |  2 |        1 |
 |  3 |        3 |
 |  4 |        1 |
 |  5 |        1 |
 +----+----------+   
一个简单的命令和限制,你会得到你这些最高的


我不会在这里接受付款-但有些积分会很好

我猜他要的是MAXCOUNT*。哇,太快了!嗨,草莓,在第二个公式中,似乎过滤掉了非重叠记录,第二个id列将重叠调用分组成一个数字,然后我只使用某种类型的计数或组来查找并发事件的最大数量?两个查询都过滤掉了“非重叠”记录!2与3重叠,3与2、4和5重叠。不同之处在于,第二个查询只显示每个重叠一次。这可能是可取的,也可能不是可取的!哦,好吧,现在我看到9:00:00确实被过滤掉了。因此,要找到一次发生的最大并发事件数,我需要添加什么?在这种情况下是3,除非我今天完全脑死亡,因为09:03:00、09:11:00和09:12:00都是同时发生的?如果你愿意,可以在一张纸上画出来。只有两个并发事件。项目3几乎与项目2重叠,然后独立运行一段时间,然后与项目4重叠,然后与项目5重叠。没有其他事件与任何其他事件重叠。
nothing overlaps item 1
1 thing overlaps item 2 (item 3), 
3 things overlap item 3 (items 2, 4, & 5), and
1 thing (item 3) overlaps each of items 4 & 5!


 SELECT x.id
      , COUNT(y.id) overlaps
    FROM my_table x
    LEFT
    JOIN my_table y
      ON y.id <> x.id
     AND y.dt < (x.dt + INTERVAL x.duration SECOND)
     AND (y.dt + INTERVAL y.duration SECOND) > x.dt
   GROUP
      By x.id;

 +----+----------+
 | id | overlaps |
 +----+----------+
 |  1 |        0 |
 |  2 |        1 |
 |  3 |        3 |
 |  4 |        1 |
 |  5 |        1 |
 +----+----------+