取最大值的问题

MARKtft 2010-09-14 12:59:44
Dear All:
小弟今被一sql困扰,请高人帮忙指点迷津。
create table test4
(well_id varchar2(10),
prod_date date,
val number);

insert into test4 values('A',to_date('2010-6-1','yyyy-mm-dd'),1);
insert into test4 values('A',to_date('2010-6-1','yyyy-mm-dd'),2);
insert into test4 values('A',to_date('2010-6-1','yyyy-mm-dd'),3);
insert into test4 values('A',to_date('2010-6-1','yyyy-mm-dd'),4);

insert into test4 values('A',to_date('2010-6-3','yyyy-mm-dd'),5);
insert into test4 values('A',to_date('2010-6-3','yyyy-mm-dd'),6);
insert into test4 values('A',to_date('2010-6-3','yyyy-mm-dd'),7);
insert into test4 values('A',to_date('2010-6-3','yyyy-mm-dd'),8);

insert into test4 values('A',to_date('2010-6-5','yyyy-mm-dd'),9);
insert into test4 values('A',to_date('2010-6-5','yyyy-mm-dd'),10);
insert into test4 values('A',to_date('2010-6-5','yyyy-mm-dd'),11);

insert into test4 values('A',to_date('2010-7-1','yyyy-mm-dd'),12);
insert into test4 values('A',to_date('2010-7-1','yyyy-mm-dd'),13);
insert into test4 values('A',to_date('2010-7-1','yyyy-mm-dd'),14);

commit;



先希望取出 well_id组内,小于输入日期的最近3个日期对应的记录。
例如:A分组内小于2010-7-3的3个日期(2010-7-1 、2010-6-5、2010-6-3) 的所有记录。
小弟sql菜鸟,通过子查询来实现该功能。
但是觉得大家肯定有更简单的方法。还望高手不甚赐教。

my sql as followings sucks:

select b.* from test4 b
where exists
(select 1 from
(select well_id,prod_date from
(select distinct well_id,prod_date from test4
where prod_date <= to_date('2010-7-3','yyyy-mm-dd')
order by prod_date desc) where rownum<=3) a
where a.well_id = b.well_id and a.prod_date = b.prod_date);
...全文
120 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 marktft 的回复:]
引用 1 楼 phoenix_99 的回复:

SQL code
select well_id,prod_date,val from(
select well_id,prod_date,val,DENSE_RANK() over(partition by well_id order by prod_date desc) rn from test4
where prod_date <= t……
[/Quote]up
kingkingzhu 2010-09-14
  • 打赏
  • 举报
回复
一般来说 你这个分组排序 使用分析函数 应该 是 效率最高的了
MARKtft 2010-09-14
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 phoenix_99 的回复:]

SQL code
select well_id,prod_date,val from(
select well_id,prod_date,val,DENSE_RANK() over(partition by well_id order by prod_date desc) rn from test4
where prod_date <= to_date('2010-7-3','yyyy-mm-……
[/Quote]

多谢!确实比我的sql简单。不知道还有更简单的sql不?
Phoenix_99 2010-09-14
  • 打赏
  • 举报
回复
select well_id,prod_date,val from(
select well_id,prod_date,val,DENSE_RANK() over(partition by well_id order by prod_date desc) rn from test4
where prod_date <= to_date('2010-7-3','yyyy-mm-dd')
) where rn <= 3

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧