MySQL - 排除冲突的日期范围

标签 mysql conflict date-range

想象一下这个日期范围列表

> SELECT * FROM range_table;
+----+------------+------------+
| id | start      | end        |
+----+------------+------------+
|  1 | 2014-01-01 | 2014-01-15 | /* -- Not conflicting */
|  2 | 2014-01-15 | 2014-01-16 | /* -- Conflicting     */
|  3 | 2014-01-15 | 2014-01-20 | /* |                  */
|  4 | 2014-01-15 | 2014-01-19 | /* /                  */
|  5 | 2014-01-24 | 2014-01-26 | /* -- Conflicting     */
|  6 | 2014-01-21 | 2014-01-25 | /* /                  */
+----+------------+------------+

我正在尝试删除冲突范围并仅保留每个冲突集的第一次出现。

这是我最后应该得到的:

+----+------------+------------+
| id | start      | end        |
+----+------------+------------+
|  1 | 2014-01-01 | 2014-01-15 |
|  2 | 2014-01-15 | 2014-01-16 |
|  5 | 2014-01-24 | 2014-01-26 |
+----+------------+------------+

这是fiddle

最佳答案

SELECT x.*
  FROM range_table x
  LEFT 
  JOIN range_table y
    ON y.start < x.end 
   AND y.end > x.start 
   AND y.id < x.id
 WHERE y.id IS NULL;

http://sqlfiddle.com/#!2/6f723/26

查询已修改以适应明显修改的摘要

关于MySQL - 排除冲突的日期范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22250526/

相关文章:

mysql - 使用 group_concat 的单个查询中的多个文本字段

git rebase,跟踪 'local' 和 'remote'

ios - 从日期范围创建日期字符串数组

javascript - 如何从一系列日期范围(可能有重叠的工作日期)中查找某人的工作经验年数

PHP 无法从数据库下载上传的文件,因为使用中文文件名上传

php - 这些查询可以变成 REPLACE INTO 吗?

mysql - UTF-8 仅在 Grails 1.1 数据库表中

rebase期间的git子模块冲突导致提交消失

jQuery - 多个 setInterval 冲突

java - 以编程方式更改日期范围的日期格式