表结构大致如下:
ID NAME INSERT_TIME
1 A1 10:01
2 A1 10:02
3 A2 11:01
4 A2 09:02现在的需求是要根据插入的时间查询出所有name最新的数据例如对于上面的数据,查询出来的结果应该是 ID为2和3的记录。大家帮忙看看这个sql该如何写?
ID NAME INSERT_TIME
1 A1 10:01
2 A1 10:02
3 A2 11:01
4 A2 09:02现在的需求是要根据插入的时间查询出所有name最新的数据例如对于上面的数据,查询出来的结果应该是 ID为2和3的记录。大家帮忙看看这个sql该如何写?
解决方案 »
- 学习Oracle前应该先学什么?
- left join ...on 与left join ...using的区别是什么
- 提问一个简单的SQL问题
- 关于在LINUX下安装ORAQCEL10G的问题
- Oracle有没有工具查看表和表之间的关系?
- precise i3(veritas i3) 这个数据库监控软件有没有人使用过?
- 请问我的这个查询语句该怎么优化?
- 超级弱质的问题:)
- redhat7.1下oracle8i的安装问题。
- 如何读取Oracle中较长的BLOB字段,存到一个文件中去?急!!!
- 如何用shell脚本批量删除oracle数据库中的表
- 關掉form時,如何不讓彈出窗口,提示“要儲存您已做的變更嗎”
from tb
where
insert_time=(select top 2 max(insert_time) from tb
order by insert_time desc )
select * from table where (name,insert_time) in
(select name,max(insert_time) insert_time from table group by name)
ls 是不是把我的问题看错了? 你写的sql不符合要求,因为如果有多个name的时间相同的话,取出来的数据就不正确。
这个sql应该有一个group by的。
(
select 1 as id, 'A1' as name, '10:01' as insert_time from dual
union all
select 2 as id, 'A1' as name, '10:02' as insert_time from dual
union all
select 3 as id, 'A2' as name, '11:01' as insert_time from dual
union all
select 4 as id, 'A2' as name, '09:02' as insert_time from dual
)
select * from t
where (name, insert_time) in (select name, max(insert_time) from t group by name)
order by id; ID NAME INSERT_TIME
---------- ---- -----------
2 A1 10:02
3 A2 11:01
可以查询出正确的数据。 但是能否使用id来作为in的条件,因为数据表中的数据量很大,如果使用这个写法性能会比较差。
--你可以建一个name,insert_time的复合索引
--如果一定要使用id的话,试下下面这个,效率不知道,可以试试
select *
from table
where id in
(
select a.id
from table a
where a.insert_time =
(select max(b.insert_time) from table b where b.name=a.name)
)
SELECT ID, NAME, INSERT_TIME
FROM Tb A
WHERE INSERT_TIME >= ALL (SELECT INSERT_TIME FROM Tb WHERE NAME = A.NAME);
select name,max(test.insert_time) time from test group by name) test2
where test.name=test2.name and test.insert_time = test2.time