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) 上有一个索引会有所帮助。
如果这不是您要查找的内容,请添加一些说明。
我有一个数据库,其中有许多 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) 上有一个索引会有所帮助。
如果这不是您要查找的内容,请添加一些说明。