首页 > 解决方案 > 将mysql中同一张表的行值与条件进行比较

问题描述

我有这样的数据:

header_id | class | start_date | end_date
-------------------------------------------
1         | c1    | 20-08-2019 | 22-08-2019
1         | c1    | 22-08-2019 | 24-08-2019
1         | c2    | 24-08-2019 | 27-08-2019
2         | c3    | 21-08-2019 | 22-08-2019
2         | c2    | 22-08-2019 | 25-08-2019
2         | c3    | 25-08-2019 | 26-08-2019

我想得到以下结果:

header_id | class | start_date | end_date
-------------------------------------------
1         | c1    | 20-08-2019 | 24-08-2019
1         | c2    | 24-08-2019 | 27-08-2019
2         | c3    | 21-08-2019 | 22-08-2019
2         | c2    | 22-08-2019 | 25-08-2019
2         | c3    | 25-08-2019 | 26-08-2019

如果 header_id 相同,class 相同,且前一个数据的结束日期与之后数据的开始日期相同,则取开始日期的最小日期和结束日期的最大日期。但是,如果之前数据的结束日期与之后数据的开始日期不同,则数据将正常显示。

有没有办法得到这个结果?

标签: mysqlsql

解决方案


这个有点棘手,但您可以LEFT JOIN在表格本身然后使用LEAST,GREATESTMIN MAX函数的组合,如下所示:

SELECT header_id,class,MIN(st_date),MAX(en_date) FROM
   (SELECT a.header_id,a.class,
           LEAST(IFNULL(a.start_date,b.start_date),IFNULL(b.start_date,a.start_date)) AS st_date,
           GREATEST(IFNULL(a.end_date,b.end_date),IFNULL(b.end_date,a.end_date)) AS en_date
    FROM   testing a 
    LEFT JOIN testing b ON a.header_id=b.header_id 
    AND a.class=b.class 
    AND a.start_date=b.end_date) A
GROUP BY header_id,class,st_date
ORDER BY header_id,class,st_date;

在此处参考小提琴:https ://www.db-fiddle.com/f/m5HQ5rrVHu4FQNBEeqc7j9/0


推荐阅读