按某些字段对记录进行分组记录,但前提是它们彼此“相邻”

时间:2015-06-19 17:51:36

标签: sql ms-access

我需要根据一些奇怪的要求将记录分组到表中。我已经非常接近我所需要的,但我无法得到最后一点。

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中工作....所以就是这样。

2 个答案:

答案 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)

这会产生上面显示的预期结果。