我需要根据一些奇怪的要求将记录分组到表中。我已经非常接近我所需要的,但我无法得到最后一点。
ID Task Time
1 Task1 6:00 AM
1 Task1 6:05 AM
1 Task1 6:10 AM
1 Task2 6:15 AM
1 Task2 6:20 AM
1 Task1 6:30 AM
2 Task1 9:00 AM
2 Task1 9:05 AM
2 Task2 9:10 AM
我需要分组任务但不是如果它们来自不同的ID,而不是它们彼此不是“下一个”,并且我只想返回一组任务的最新时间。
因此,上述结果应如下所示:
ID Task Time
1 Task1 6:10 AM
1 Task2 6:20 AM
1 Task1 6:30 AM
2 Task1 9:05 AM
2 Task2 9:10 AM
我已经找出按任务/ ID分组并获取最新的时间部分,但不是关于只有在它们彼此“下一步”(即没有被不同的任务分开)时对它们进行分组的部分。 / p>
这就是我现在所拥有的:
SELECT ID, Task, MAX(Time) AS Latest FROM
(SELECT ID, Task, Time FROM TaskTable)
GROUP BY ID, Task
这会产生以下结果:
ID Task Time
1 Task2 6:20 AM
1 Task1 6:30 AM
2 Task1 9:05 AM
2 Task2 9:10 AM
正如您所看到的,ID 1中的所有Task1都在最新的Time下分组,而不是向我显示它运行的两个单独时间(在Task2之前和之后)。
哦,是的,这个SQL必须在Access中工作....所以就是这样。
答案 0 :(得分:0)
这在任何数据库中都具有挑战性,在MS Access中更是如此,因为它对现代SQL函数的实现有限。
但是,有一种方法。在任何给定任务之前,使用相关子查询来计算不同任务的数量。虽然任务是相同的,但这是一个常量,然后可以用于聚合。
select task, mint(time), max(time)
from (select t.*,
(select count(*)
from tasks as t2
where t2.task <> t.task and
t2.id = t.id and
t2.time < t.time
) as grp
from tasks as t
) as t
group by grp, task
答案 1 :(得分:0)
使用Gordon Linoff提供的样本和这个问题的答案:Grouping similar rows next to each other in MySQL(虽然很接近但不完全相同),我能够拼凑出一个能够精确满足我需求的解决方案。它如下:
select id, task, max(time)
from (select t.*,
(select count(*)
from TEST t2
where t2.time < t.time and t2.task <> t.task
) as grp
from TEST t
) t
group by id, task, grp
order by max(time)
这会产生上面显示的预期结果。