Mysql 列出时间线并计算重叠

Mysql 列出时间线并计算重叠,mysql,timeline,Mysql,Timeline,我有以下样本数据集 CREATE TABLE timeline ( id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY, name VARCHAR(30) NOT NULL, s_t DATETIME, e_t DATETIME, quantity INT(3) ); INSERT INTO timeline (`id`,`name`, `s_t`, `e_t`, `quantity`) VALUES (NULL, "joe", &q

我有以下样本数据集

CREATE TABLE timeline (
id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(30) NOT NULL,
s_t DATETIME,
e_t DATETIME,
quantity INT(3)
);

INSERT INTO timeline
(`id`,`name`, `s_t`, `e_t`, `quantity`)
VALUES
(NULL, "joe", "2021-01-15 10:00:00", "2021-01-15 14:00:00","1"),
(NULL, "joe", "2021-01-15 15:00:00", "2021-01-15 18:00:00","1"),
(NULL, "joe", "2021-01-15 19:00:00", "2021-01-15 21:00:00","1"),
(NULL, "frank", "2021-01-15 10:00:00", "2021-01-15 14:00:00","1"),
(NULL, "frank", "2021-01-15 13:00:00", "2021-01-15 18:00:00","1"),
(NULL, "frank", "2021-01-15 19:00:00", "2021-01-15 21:00:00","1"),
(NULL, "bob", "2021-01-15 10:00:00", "2021-01-15 14:00:00","1"),
(NULL, "bob", "2021-01-15 15:00:00", "2021-01-15 18:00:00","1"),
(NULL, "bob", "2021-01-15 19:00:00", "2021-01-15 21:00:00","1"),
(NULL, "harry", "2021-01-17 14:00:00", "2021-01-17 17:00:00","1"),
(NULL, "harry", "2021-01-17 10:00:00", "2021-01-17 15:00:00","1"),
(NULL, "harry", "2021-01-17 08:00:00", "2021-01-17 11:00:00","1");
  
我试图在没有重叠时间的情况下,每个名字的总和为1,在有重叠时间的情况下,每个名字的总和为2或更多。 不需要有一个注释栏——这只是为了说明我的观点

身份证件 名称 开始 终止 全部的 笔记 7. 上下快速移动 2021-01-15 10:00:00 2021-01-15 14:00:00 1. 9 上下快速移动 2021-01-15 19:00:00 2021-01-15 21:00:00 1. 8. 上下快速移动 2021-01-15 15:00:00 2021-01-15 18:00:00 1. 4. 直率的 2021-01-15 10:00:00 2021-01-15 14:00:00 2. 重叠 5. 直率的 2021-01-15 13:00:00 2021-01-15 18:00:00 2. 重叠 6. 直率的 2021-01-15 19:00:00 2021-01-15 21:00:00 1. 12 骚扰 2021-01-17 08:00:00 2021-01-17 11:00:00 2. 重叠 11 骚扰 2021-01-17 10:00:00 2021-01-17 15:00:00 3. 2重叠 10 骚扰 2021-01-17 14:00:00 2021-01-17 17:00:00 2. 重叠 1. 乔 2021-01-15 10:00:00 2021-01-15 14:00:00 1. 2. 乔 2021-01-15 15:00:00 2021-01-15 18:00:00 1. 3. 乔 2021-01-15 19:00:00 2021-01-15 21:00:00 1.
考虑以下几点

SELECT x.*
     , COUNT(*) total 
     , GROUP_CONCAT(y.id) overlaps
  FROM timeline x  
  JOIN timeline y 
    ON y.s_t <= x.e_t 
   AND y.e_t >= x.s_t 
   AND y.name = x.name
 GROUP 
    BY x.id;
+----+-------+---------------------+---------------------+----------+-------+----------+
| id | name  | s_t                 | e_t                 | quantity | total | overlaps |
+----+-------+---------------------+---------------------+----------+-------+----------+
|  1 | joe   | 2021-01-15 10:00:00 | 2021-01-15 14:00:00 |        1 |     1 | 1        |
|  2 | joe   | 2021-01-15 15:00:00 | 2021-01-15 18:00:00 |        1 |     1 | 2        |
|  3 | joe   | 2021-01-15 19:00:00 | 2021-01-15 21:00:00 |        1 |     1 | 3        |
|  4 | frank | 2021-01-15 10:00:00 | 2021-01-15 14:00:00 |        1 |     2 | 4,5      |
|  5 | frank | 2021-01-15 13:00:00 | 2021-01-15 18:00:00 |        1 |     2 | 5,4      |
|  6 | frank | 2021-01-15 19:00:00 | 2021-01-15 21:00:00 |        1 |     1 | 6        |
|  7 | bob   | 2021-01-15 10:00:00 | 2021-01-15 14:00:00 |        1 |     1 | 7        |
|  8 | bob   | 2021-01-15 15:00:00 | 2021-01-15 18:00:00 |        1 |     1 | 8        |
|  9 | bob   | 2021-01-15 19:00:00 | 2021-01-15 21:00:00 |        1 |     1 | 9        |
| 10 | harry | 2021-01-17 14:00:00 | 2021-01-17 17:00:00 |        1 |     2 | 10,11    |
| 11 | harry | 2021-01-17 10:00:00 | 2021-01-17 15:00:00 |        1 |     3 | 11,12,10 |
| 12 | harry | 2021-01-17 08:00:00 | 2021-01-17 11:00:00 |        1 |     2 | 12,11    |
+----+-------+---------------------+---------------------+----------+-------+----------+

嗨,谢谢你看。除8外,数据正确。也应该是2021年1月15日。更新如下。我的查询结果是错误的。我希望结果像上面的表格一样。。。id 1,2,3没有任何重叠,因此每个数量应为1。我们不是拿乔、弗兰克、鲍勃等做比较,而是把每个人都和自己做比较。。。在你的问题中,你没有提到那个相当突出的事实:-。对不起。我以为桌子上说得很清楚。我知道不是。我将更新原来的帖子,我感谢你指出我本可以更清楚。我真的很感谢你的帮助。我不确定我是否遵循了你的代码,但它似乎给了我想要的确切结果。非常感谢。重叠规则如下:如果事件A在事件B结束之前开始,并且在事件B开始之后结束,则事件A与事件B重叠。我的查询所做的只是通过将表连接到自身并比较开始日期和结束日期来测试这一点。