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

SQL selecting the rows with latest datetime group by another column

我有一个数据库,其中有许多 table 看起来像这样(稍微简化了一点)

    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.

分组的特定项目的所有最新(处理时间(日期时间))行

因此对于 table 示例,人们会期望 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 |    ...
   ... |       ... |     ... |                  ... |    ...

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

    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 在该查询中显然是未定义的,我不确定如何获得该值。

(注意 processed_time 不是唯一的)

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

Return 相同 item_id 和 type_id

的最后一项

由于您的描述与第二个示例输出不匹配,所以有些混乱。您似乎想在 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 );

哪个returns:

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) 上有一个索引会有所帮助。

如果这不是您要查找的内容,请添加一些说明。