【问题标题】:Group records by certain fields but only if they're "next" to each other按某些字段对记录进行分组,但前提是它们彼此“相邻”
【发布时间】:2015-06-22 22:30:39
【问题描述】:

我需要根据一些奇怪的要求对表中的记录进行分组。我已经非常接近我需要的东西,但我无法获得最后一点。

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 分组并获取最新的时间部分,但不是关于仅在它们彼此“相邻”(即不被不同的任务分隔)时才对它们进行分组的部分。

这是我现在拥有的:

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 都分组在最新时间下,而不是向我显示它运行的两个单独时间(在 Task2 之前和之后)。

哦,是的,这个 SQL 必须在 Access 中工作......所以就是这样。

【问题讨论】:

    标签: sql ms-access


    【解决方案1】:

    这在任何数据库中都是具有挑战性的,在 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
    

    【讨论】:

    • 不幸的是,这给了我与上述相同的错误结果:只有四个记录,其中排除了上午 6:10 的 Task1。您的查询也不会区分在不同 ID 下运行的相同任务(这是必要的)。
    【解决方案2】:

    使用 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)
    

    这会产生如上所示的预期结果。

    【讨论】:

      猜你喜欢
      • 2010-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-18
      相关资源
      最近更新 更多