2 woshizhuyoulei woshizhuyoulei 于 2016.09.10 21:20 提问

oracle中用一个sql实现要求

有一个表,大概几千行记录,里面有ip 时间 id等一些字段,ip只有几个不重复的值,时间都不同,现在要取出每一个不同ip对应的最近时间的一条记录,能不能只用一个sql语句得出结果。

6个回答

zhuzige521888
zhuzige521888   2016.09.10 21:43
已采纳

用开窗函数比较简单 具体如下 :
SELECT * FROM (SELECT ROW_NUMBER() OVER(PARTITION BY ip ORDER BY time DESC) rn, t.* FROM tablename t) WHERE rn = 1 ;

zhuzige521888
zhuzige521888 =0就是第一条,<=1 就是前两条,<=2,就是前三条
一年多之前 回复
zhuzige521888
zhuzige521888 create table dtest( dip number, dtime date, dname varchar(20) ) select * from duan a where (select count(1) from duan b where a.dip = b.dip and b.dtime > a.dtime ) <=1 order by dip,dtime;
一年多之前 回复
zhuzige521888
zhuzige521888 回复哎梦哦彼咯: 多个字段用开窗函数第二个select后加上你想要的字段,或者tablename.*,groupby的不行。
一年多之前 回复
woshizhuyoulei
woshizhuyoulei 这样能得到每一个ip的最近一条记录吗
一年多之前 回复
woshizhuyoulei
woshizhuyoulei 我想得到一整条记录 这样出来只有两个字段
一年多之前 回复
zhuzige521888
zhuzige521888 这种也可以:select ip,max(time) from tablename group by ip;
一年多之前 回复
zhuzige521888
zhuzige521888 oracle进行分组后,取出每组的前几条数据SELECT *FROM (SELECT 分组的字段名, ROW_NUMBER() OVER(PARTITION BY 分组的字段名 ORDER BY 排序的字段名) AS RNFROM 表名)WHERE RN <= 10??
一年多之前 回复
caoxiaohucxh
caoxiaohucxh   2016.09.13 21:41

select ip,time,id from (select * from t order by time desc)group by ip

Samme
Samme   2016.09.11 19:21

表 abc 字段ip ,时间 date
Select max(ip),(Select max(date) From abc b where date=a.date) date
From abc a
Group by ip

qq_23898511
qq_23898511   2016.09.12 10:00

给你写详细一点,望采纳:
表A:
唯一标识 : id ,其他字段:ip ,时间:atime
需求(取到表内”ip”最近一次时间的数据)
----------------------------------------------------------------
第一步:取到所有关于“ip”字段最新一次数据
select ip,max(atime)maxtime from A group by ip
第二步:关联A表取到所有数据
select A.* from A inner join (select ip,max(atime)maxtime from A group by ip)a2 on A.ip=a2.ip and a.time=a2.maxtime

lpsky0865
lpsky0865   2016.09.12 11:26

呵呵,何必那么麻烦,一条语句就可以了。
表名table, 最近一次时间的数据,应该使用rowid较大的那一条

 select * from table a where not exists (
        select 1 from table b where a.ip = b.ip and b.rowid > a.rowid
);
yushiyoufight
yushiyoufight 揣测了
大约一年之前 回复
beyon2008
beyon2008   2016.10.19 09:34

select *
from t
where (ip, dt) in (select ip, max(dt) lastdt from t group by ip)

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!