分组取最大N条记录方法

zeroczh 2013-09-16 03:06:35
刚看了,http://bbs.csdn.net/topics/330021260 这个帖子,可以查出去一条的记录

ID UserId CreateDate
1 A1 2013-8-11
2 A1 2013-9-11
3 A2 2013-2-11
4 A2 2013-7-11
....................
....................

如果没有条件的话我是这样写的
select * from table1 t where not exist( select 1 from table1 where table1.userid = t.user and table1.createdate > t.create)

但是如果我要加一个日期条件,就是要在2013-8-12日前的最近的数据,应该要怎么做?

结果应该要这样
ID UserId CreateDate
1 A1 2013-8-11
4 A2 2013-7-11
...全文
266 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
gangma2 2014-03-29
  • 打赏
  • 举报
回复
select t1.id,t1.userid,t1.createdate from table1 t1,
(select userid, max(createdate) as createdate
from table1
where createdate<to_date('2013-8-12','yyyy-mm-dd')
group by userid) t2
where t1.userid=t2.userid and t1.createdate=t2.createdate
order by t1.id;
结果:
u010412956 2013-09-17
  • 打赏
  • 举报
回复
引用 4 楼 zeroczh 的回复:
[quote=引用 1 楼 u010412956 的回复:] 问下楼主 ,要在2013-8-12日前的最近的数据? 也就是说2013-8-13 应该 比2013-8-10 近?
如果是 2013-8-12日前的话就是只能 2013-8-12日的数据了 [/quote]噢,开始没仔细看。。那你这需求 挺简单的。 分析函数、、排序+rownum 、子查询 等等
zeroczh 2013-09-17
  • 打赏
  • 举报
回复
select * from table1 t where not exist( select 1 from table1 where table1.userid = t.user and table1.createdate > t.createdate and createdate < TO_DATE('2013-8-12','YYYY/MM/DD')) and createdate < TO_DATE('2013-8-12','YYYY/MM/DD') 我目前是这样写的,部知道其他方法该怎么写
zeroczh 2013-09-17
  • 打赏
  • 举报
回复
引用 1 楼 u010412956 的回复:
问下楼主 ,要在2013-8-12日前的最近的数据? 也就是说2013-8-13 应该 比2013-8-10 近?
如果是 2013-8-12日前的话就是只能 2013-8-12日的数据了
  • 打赏
  • 举报
回复
方法很多 1、取出每组userid在范围内最大日期 然后关联原表查询所有字段 2、row_number() over()排序取每组第一行数据 3、having count() (少用) 4、比较 子查询
善若止水 2013-09-16
  • 打赏
  • 举报
回复
涉及到排序的,就应该用order by函数,在where条件中限制日期小于2013-8-12就行了
u010412956 2013-09-16
  • 打赏
  • 举报
回复
问下楼主 ,要在2013-8-12日前的最近的数据? 也就是说2013-8-13 应该 比2013-8-10 近?

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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