我有一个表的列start_date和end_date。我们需要做的是选择所有东西并按照每个Object_ID的日期冲突对它们进行分组。SQL Group按日期冲突
日期冲突是指行的开始日期和/或结束日期通过另一行时。例如,下面是一些冲突示例:
第1行的日期为第1至第5行,第2行的日期为第2至第3。
第1行的日期是第2个到第5个,第2行的日期是第1个到第3个。
第1排第2至第5排,第2排排第3至第6排。
第1行的日期是第2个到第5个,第2行的日期是第1个到第7个。
因此,举例来说,如果我们有一些样本数据(假设数字是一个月简单的几天):
id | object_id | start_date | end_date
1 | 1 | 1 | 5
2 | 1 | 2 | 4
3 | 1 | 6 | 8
4 | 2 | 2 | 3
什么,我希望看到的是:
object_id | start_date | end_date | numconflicts
1 | <na> | <na> | 2
1 | 6 | 8 | 0 or null
2 | 2 | 3 | 0 or null
而对于第二个测试案例,下面是一些示例数据:
id | object_id | start_date | end_date
1 | 1 | 1 | 5
2 | 1 | 2 | 4
3 | 1 | 6 | 8
4 | 2 | 2 | 3
5 | 2 | 4 | 5
6 | 1 | 2 | 3
7 | 1 | 10 | 12
8 | 1 | 11 | 13
而对于第二个测试案例,我希望看到作为输出:
object_id | start_date | end_date | numconflicts
1 | <na> | <na> | 3
1 | 6 | 8 | 0 or null
2 | 2 | 3 | 0 or null
2 | 4 | 5 | 0 or null
1 | <na> | <na> | 2
是的,我需要区分第一和第二组(第一个和最后一个行)的一些方式,但我还没有完全想通了这一点。目标是查看此列表,然后当您单击一组冲突时,您可以查看该组中的所有冲突。
我的第一个想法是尝试一些GROUP BY CASE ...子句,但我只是用头围绕自己。
我用来调用mysql的语言是php。所以如果有人知道一个PHP循环的解决方案,而不是一个大型的MySQL查询我都耳闻。
在此先感谢。
编辑:在主键中添加,以减少混淆。
编辑:添加在测试用例2中以提供更多推理。
没有,OBJECT_ID并不是指表的ID,它只是指对象到不同的表使用该ID。意思是,只有具有类似object_id的行可能有冲突的可能性。 – Peanut
只是一个想法:如果你打算冲突行是可点击和可扩展的,把''而不是实际日期似乎没有太大意义。如果我是你,我可能会使用'MIN(start_date)AS start_date'和'MAX(end_date)AS end_date'作为冲突行。这样用户就能立即看到冲突组属于哪个日期范围,而不必先点击/展开它。 –