SQL用另一列选择具有最新日期时间组的行

时间:2015-03-17 09:08:22

标签: mysql sql group-by

我有一个包含许多表格的数据库(简化了一点)

    id |  item_id  | type_id |  processed_time      |  other cols
 ------|-----------|---------|----------------------|-------------
     1 |         1 |       1 |  2015-03-17 00:11:22 |    ...
     2 |         1 |       1 |  2015-03-17 00:22:33 |    ...
     3 |         1 |       2 |  2015-03-17 00:11:22 |    ...
     4 |         1 |       2 |  2015-03-17 00:33:44 |    ...
     5 |         2 |       1 |  2015-03-17 00:22:33 |    ...
     6 |         2 |       1 |  2015-03-17 00:11:22 |    ...
     7 |         2 |       2 |  2015-03-17 00:22:33 |    ...
     8 |         2 |       2 |  2015-03-17 00:33:44 |    ...
   ... |       ... |     ... |                  ... |    ...

我正在尝试执行一些查询,但它们都遵循相同的主题: 选择按type_id分组的特定项目的所有最新(处理时间(日期时间))行。

因此,使用表示例,可以预期,对于item_id = 1,获取:

    id |  item_id  | type_id |  processed_time      |  other cols
 ------|-----------|---------|----------------------|-------------
     2 |         1 |       1 |  2015-03-17 00:22:33 |    ...
     4 |         1 |       2 |  2015-03-17 00:33:44 |    ...
   ... |       ... |     ... |                  ... |    ...

除此之外,我想对所有项目执行此查询,I.E:

    id |  item_id  | type_id |  processed_time      |  other cols
 ------|-----------|---------|----------------------|-------------
     2 |         1 |       1 |  2015-03-17 00:22:33 |    ...
     4 |         1 |       2 |  2015-03-17 00:33:44 |    ...
     5 |         2 |       1 |  2015-03-17 00:22:33 |    ...
     8 |         2 |       2 |  2015-03-17 00:33:44 |    ...
   ... |       ... |     ... |                  ... |    ...

我遇到的主要问题是我不确定如何在抓取最近处理的时间之后获得id。我继续前进的方向是类似于SELECT id, MAX(processed_time) FROM item GROUP BY type_id的子查询,但是id中的{{1}}显然是未定义的,我不确定如何获得该值。

(请注意,processed_time不是唯一的)

2 个答案:

答案 0 :(得分:1)

由于您的描述和第二个示例输出不匹配,因此存在一些混淆。看起来您想在item_id中找到最新的type_id。在这种情况下,从您显示的数据样本中,将有四行 - 对于item_id = 1表示两行:type_id为1和2,对于item_id = 2表示两行:type_id 1和2.

如果是这种情况,简单的相关子查询将是您最好的方法之一。

select  *
from    Source s
where   s.processed_time =(
            select  Max( processed_time )
            from    Source
            where   item_id = s.item_id
                and type_id = s.type_id );

返回:

id item_id type_id processed_time
-- ------- ------- -------------------
2        1       1 2015-03-17 00:22:33
4        1       2 2015-03-17 00:33:44
5        2       1 2015-03-17 00:22:33
8        2       2 2015-03-17 00:33:44

如果(item_id,type_id,processed_time)上有索引,将会有所帮助。

如果这不是您正在寻找的内容,请添加一些说明。

答案 1 :(得分:0)

SELECT t.*
FROM table t
WHERE NOT EXISTS ( SELECT 'a'
                   FROM table t2
                   WHERE t2.item_id = t.item_id
                   AND t2.type_id = t.type_id 
                   AND t2.processed_time > t.processed_time
                   AND t2.id > t.id   -- (note that processed_time is not unique)
                 )

返回相同item_id和type_id

的最后一项