mysql - 将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 相同,且前一个数据的结束日期与之后数据的开始日期相同,则取开始日期的最小日期和结束日期的最大日期。但是,如果之前数据的结束日期与之后数据的开始日期不同,则数据将正常显示。
有没有办法得到这个结果?
解决方案
这个有点棘手,但您可以LEFT JOIN
在表格本身然后使用LEAST
,GREATEST
和MIN 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
推荐阅读
- laravel - 如何为多租户自定义 laravel 队列工作命令?
- angular - “AbstractControl”缺少“FormControl”类型的以下属性
- awk - awk 如果相同的字符串则在 1 行中打印
- javascript - 如何在反应材料表中始终显示排序图标并为当前排序列显示蓝色
- excel - 只要信息是最新的,我需要什么公式来搜索一个单元格中的文本并将其插入另一个单元格(不是所有文本)?
- mysql - mysql DB中不同表中的相同列名在导入power bi时会出错吗?
- visual-studio - 卸载由 .sln 文件制作的 WxWidgets
- c - 如何使用 AddressSanitizer 输出获取行号?
- nginx - nginx错误将代理缓存添加到多个服务器或位置
- python - 无法在 Google App Engine 上部署 Flask 应用程序,出现错误“502 Bad Gateway”