我有一个包含许多表格的数据库(简化了一点)
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不是唯一的)
答案 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
的最后一项