确定日期范围是否包含在MySQL中的另一个范围中
我正在寻找一种干净的方法,而不是3..n交叉联接,只是想知道是否可以在sql中实现,如果不可以,我将寻求另一种解决方案。 将使用数字而不是日期来简化 我有n行,其中包含n个任务和n个项目确定日期范围是否包含在MySQL中的另一个范围中,mysql,sql,Mysql,Sql,我正在寻找一种干净的方法,而不是3..n交叉联接,只是想知道是否可以在sql中实现,如果不可以,我将寻求另一种解决方案。 将使用数字而不是日期来简化 我有n行,其中包含n个任务和n个项目 task item start end 1 1 1 5 1 2 2 6 1 3 0 4 1 4 8 10 在这种情况下,我希望使用minstart maxend来显示重
task item start end
1 1 1 5
1 2 2 6
1 3 0 4
1 4 8 10
在这种情况下,我希望使用minstart maxend来显示重叠日期,因此结果将是:
task item start end
1 1,2,3 0 6
1 4 8 10
有没有关于如何在sql中解决它的想法?这就像是一个挑战,如果不能这样做,我会去python
谢谢这类似于我回答的问题,以及类似的数据孤岛问题。然而,在你的情况下,这更为复杂,因为岛屿的识别将需要根据不仅仅是之前的记录来计算 它最终会看起来像这样:
SET @iEnd = -1; /* init value should be something you don't expect to see */
SET @task = -1; /* init value should be something you don't expect to see */
SET @isNewIsland = 0 /* init value doesn't actually matter */;
SET @i = 0;
SELECT islandNum
, GROUP_CONCAT(item ORDER BY item) AS items
, MIN(start) AS iStart
, MAX(end) AS iEnd
FROM (
SELECT @isNewIsland := IF(@task <> task OR start > @iEnd, 1, 0)
, @task := task, item, start, end
, @i := IF(@isNewIsland = 1, @i + 1, @i) AS islandNum
, @end := IF(@isNewIsland = 1, end, GREATEST(end, @iEnd))
FROM ( /* Session(@) variables evaluation can be a bit unpredictable
the subquery helps guarantee ordering before evaluation */
SELECT task, item, start, end
FROM theTable
ORDER BY task, start, end
) AS subQ
) AS subQ 2
有些人不喜欢使用单独的、前面的SET语句;为了避免这种需要,将AS subQ替换为
作为subQ,选择@iEnd:=-1、@task:=-1、@isNewIsland:=0、@i:=0作为sInit以干净的方式执行此操作。这是指什么?你的实际问题是什么?如果你编辑你的问题,包括CREATETABLE和insert语句,你会得到更多的帮助。也使用日期。无论如何,我更喜欢python的想法