mysql - 使用mysql重叠间隔

标签 mysql sql date datetime mysql-8.0

    +------+------------+------------+
    | id   | start_date | end_date   |
    +------+------------+------------+
    |    1 | 2019-01-01 | 2019-01-12 |
    |    1 | 2019-01-10 | 2019-01-27 |
    |    1 | 2019-01-13 | 2019-01-15 |
    |    1 | 2019-01-18 | 2019-01-25 |
    |    1 | 2019-02-10 | 2019-02-15 |
    |    2 | 2019-01-10 | 2019-01-15 |
    +------+------------+------------+

如何在 mysql(8.X) 中合并重叠间隔并得到以下结果?

    +------+------------+------------+
    | id   | start_date | end_date   |
    +------+------------+------------+
    |    1 | 2019-01-01 | 2019-01-27 |
    |    1 | 2019-02-10 | 2019-02-15 |
    |    2 | 2019-01-10 | 2019-01-15 |
    +------+------------+------------+

下面是mysql中可以使用的创建表的命令=>


    insert into interval_dates(id, start_date, end_date) values(1, '2019-01-01', '2019-01-12');
    insert into interval_dates(id, start_date, end_date) values(1, '2019-01-10', '2019-01-27');
    insert into interval_dates(id, start_date, end_date) values(1, '2019-01-13', '2019-01-15');
    insert into interval_dates(id, start_date, end_date) values(1, '2019-01-18', '2019-01-25');
    insert into interval_dates(id, start_date, end_date) values(1, '2019-02-10', '2019-02-15');
    insert into interval_dates(id, start_date, end_date) values(2, '2019-01-10', '2019-01-15');

您能否分享任何优雅的解决方案,无需插入mysql(8.X)中的中间表?

最佳答案

请检查:

SELECT id, start_date, MAX(end_date) end_date
FROM ( SELECT id,
              @p_start := CASE WHEN (start_date > @p_end) OR (@p_id < id)
                               THEN start_date
                               ELSE @p_start
                               END start_date,
              @p_end := CASE WHEN (end_date > @p_end) OR (@p_id < id)
                             THEN end_date
                             ELSE @p_end
                             END end_date,
              @p_id := id
       FROM mytable, ( SELECT @p_id := MIN(id)-1, 
                              @p_start := MIN(start_date) - INTERVAL 1 DAY, 
                              @p_end := MIN(start_date) - INTERVAL 1 DAY
                       FROM mytable ) variables
       ORDER BY id, start_date, end_date ) subquery
GROUP BY id, start_date;

fiddle (甚至在 5.6 中也适用)。

我尚未找到产生错误结果的源数据。

关于mysql - 使用mysql重叠间隔,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59827875/

相关文章:

java - ParseDate 无法解析

MySQL/MariaDB/SQLite : DISTINCT CONCAT

mysql - DATE_SUB 日期间隔

MySQL Inner Join 两个表上第二个表的最大值

sql - 如何将报告从一台服务器传输到另一台服务器? SSRS

android - 从 Android 中的给定字符串获取日期

java - 使用 java 1.7 从 postgres 检索时日期格式不一致

php - 使用android从WAMP服务器存储和检索图像

mysql - 不确定我是否正确地执行了 sql 查询

php - 使用事务锁定表,在同一事务中删除然后插入