繁体   English   中英

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

[英]MySQL formula to determine number of maximum concurrent events

我正在尝试一种方法来获取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开始之前结束,而事件#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 |
 +----+---------------------+----------+----+---------------------+----------+

对于“事件1”,有2件事是重叠的(项目2和项目3)。 对于“事件2”,有2件事是重叠的(项目3和项目4)。 对于“事件3”,有2件事是重叠的(项目3和项目5)。

   9.00  9.01  9.02  9.03  9.04  9.05  9.06  9.07  9.08  9.09  9.10  9.11  9.12  9.13
 1   |-|
 2               |-----------------------------------|
 3                     |-----------------------------------------------------------|
 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 |
 +----+----------+   

一个简单的ORDER BY和LIMIT将使您获得最高收益。

我在这里不接受付款-但有些要点会不错!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM